2012-03-06 4 views
4

認証にPKIを使用するJavaアプリケーションを作成しようとしています。私はMicrosoft証明書ストア(MCS)から証明書を取得し、それをOracleデータベース(11.2)に渡す必要があります。Windowsキーストア(MCS)をJDBCで使用するには?

私はjdbc:oracle:thinドライバを使用して接続しています。 Googleでかなりの時間を過ごした後、私は空になる。 私は(記事に応じて)変更するために、異なる性質を発見しました:

  • は、私は以来、動作するとは考えていないカスタムのKeyManagerを使用している場合javax.net.ssl.keyStoreType = "Windows-MY"
  • は(javax.net.ssl.keyStore = "Windows-MY"
  • javax.net.ssl.keyStore should be set to "None"を設定するプロパティを設定します私のカスタムKeyManagerに入るまでに、接続プロパティで指定されたキーストアからすでに証明書が与えられます)。

もちろん、これらの人々のすべてが成功を主張していますが、何も私のために働いていません。私はすべての事例を試してみましたが、私は運がないすべてを見つけることができました。 Oracle Walletを使用しているときに正常に認証できたので、証明書が正常であることがわかりました。誰でもこれを前にしていて、素晴らしいコードを投稿しても構いません。

ほとんどの人がウェブサイトでWindowsキーストアを使用しているため、独自の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

答えて

0

This articleはあなたの詳細を与える必要があります。システムプロパティは使用しませんが、Windows-MYは明らかにストアタイプであり、ファイルベースではありません。値なしが指定されなくてもよいこと

javax.net.ssl.keyStoreシステムプロパティ

注:したがって、javax.net.ssl.keyStoreTypeは、JSSE Ref Guide (Customization)参照Windows-MYあるべきであり、javax.net.ssl.keyStoreは(重要でよい大文字)NONEに設定されるべきです。この設定は、キーストアがファイルベースの (たとえば、ハードウェアトークンに存在する)でない場合に適しています。

サーバー証明書がデフォルトのJavaトラストストアによって信頼されていない場合も、同様の方法でトラストストアを構成する必要があります。

+0

迅速な対応に感謝します。私は両方の記事を読んだが、まだ運がない。私は試したコードと現在のエラーメッセージで元の投稿を修正しました。 – Ben

+0

ドライバがJDBCドライバの実装でJSSE Ref Guideに従わなかった場合、私は驚くことはありません。もしあなたが(そしてそれがあなたのアプリケーションの残りの部分を妨げないならば)、私は 'javax.net.ssl'プロパティをグローバルシステムプロパティとして設定し、これらのJDBCプロパティを空のままにしておきます:JDBCドライバはおそらくこの場合、デフォルトの 'SSLSocketFactory'を使用します。 – Bruno

+0

私はそれを試みましたが、それはまだ動作しません。私は 'System.setProperty(" javax.net.debug "、" SSL ");から' 'デバッグ出力が得られないことに気づいたので、ハンドシェイクプロセスではそれほど遠くはないようです。 – Ben

関連する問題