2012-03-06 30 views
4

我正在嘗試創建一個使用PKI進行身份驗證的java應用程序。我需要能夠從Microsoft證書存儲(MCS)中檢索證書並將其傳遞給Oracle數據庫(11.2)。如何在JDBC中使用Windows密鑰庫(MCS)?

我使用jdbc:oracle:thin驅動程序進行連接。在谷歌上花了一段時間之後,我已經空了。 我發現不同的屬性來改變(文章):

  • 設置屬性javax.net.ssl.keyStoreType = "Windows-MY"
  • 設置javax.net.ssl.keyStore = "Windows-MY"
  • javax.net.ssl.keyStore should be set to "None"(如果使用的是定製的KeyManager我不相信,因爲將工作當它進入我的自定義KeyManager時,我將已經獲得來自連接屬性中指定的密鑰庫的證書)。

當然,所有這些人都聲稱成功,但沒有爲我工作。我嘗試了所有沒有運氣的例子。當我使用Oracle錢包時,我能夠成功進行身份驗證,因此我知道我的證書沒問題。如果有人以前做過這個,願意發佈一些很棒的代碼。

我知道大多數人在網站上使用Windows keystore,因此正在創建自己的SSLContext,但我無法想象我是唯一一個想用JDBC來做到這一點的人(據我所知,讓我提供一個SSLContext)。

這是我認爲應該工作的代碼,但沒有。

DriverManager.registerDriver)new OracleDriver()); 
String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=host)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=someName))(SECURITY= (SSL_SERVER_CERT_DN=\"CN=TESTSERVER\")))"; 

java.util.Properties props = new java.util.Properties(); 
props.setProperty("javax.net.ssl.keyStoreType", "Windows-MY"); 
props.setProperty("javax.net.ssl.keyStore", "NONE"); 
props.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT"); 
props.setProperty("javax.net.ssl.trustStore", "NONE"); 

props.setProperty("oracle.net.ssl_server_dn_match", "true"); 
props.setProperty("oracle.net.authentication_services", "(TCPS)"); 
Connection conn = DriverManager.getConnection(url, props); 

此代碼失敗,異常:

java.sql.SQLRecoverableException: IOException: The Network Adapter could not establish the connection 
+0

不要將代碼格式設置爲不是代碼的文本。 – EJP 2016-04-22 03:31:47

回答

0

This article應該給你更多的細節。雖然它不使用系統屬性,但Windows-MY顯然是一種商店類型,它不是基於文件的。因此,javax.net.ssl.keyStoreTypeWindows-MYjavax.net.ssl.keyStore應設置爲NONE(大寫可能重要),請參閱JSSE Ref Guide (Customization)

javax.net.ssl.keyStore系統屬性

注意,值NONE可被指定。如果密鑰庫不是基於文件的 (例如,它駐留在硬件令牌中),則此設置適用。

如果您的服務器證書不受默認Java信任庫的信任,您可能還需要以類似方式配置信任庫。

+0

感謝您的快速響應。我已經閱讀了兩篇文章,但仍然沒有任何運氣。我用我嘗試過的代碼和當前錯誤消息修改了我的原始帖子。 – Ben 2012-03-06 21:56:30

+0

如果驅動程序在JDBC驅動程序實現中沒有遵循JSSE Ref Guide中的內容,我不會感到驚訝。如果可以的話(如果它不影響應用程序的其餘部分),我會嘗試將javax.net.ssl屬性設置爲全局系統屬性,並將這些JDBC屬性留空:JDBC驅動程序可能在這種情況下使用默認的'SSLSocketFactory'。 – Bruno 2012-03-06 22:05:15

+0

我試過了,但它仍然無效。我注意到我沒有從'System.setProperty(「javax.net.debug」,「SSL」)獲得任何調試輸出;'所以它在握手過程中似乎沒有太大的幫助。 – Ben 2012-03-06 22:39:08

相關問題