次の問題があります。私はSSLを介して呼び出すことができるエンドポイントと、クライアントを認証するためにクライアント証明書を使用することによってのみ呼び出すことができるいくつかのWebサービスを持っています。問題は、クライアント側の証明書を動的に変更したいということです。 私のコードは:Java Webサービスクライアント。クライアント証明書を動的に変更します。
System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
//...
// first web service call, without client side certificate -> OK
//...
System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
System.setProperty("javax.net.ssl.keyStore", "keystore1.jks");
System.setProperty("javax.net.ssl.keyStoreType", "JKS");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
//...
// second web service call
私の問題は2番目の呼び出しです。ここで私は例外を取得:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
私だけ実行する場合は、コードの2番目の部分はすべてが、それは完璧に動作しますが、大丈夫です(私はクライアント証明書とたkeystore.jksを持っている、そしてサーバはありません私の要求を正しく認証する)。私は間違って何をしていますか? webservicesを呼び出すときにクライアント側の証明書を動的に変更するにはどうすればよいですか?
+1 SSLコンテキストは一度しか設定されません – jaxb
SSLSocketFactoryを使用しようとしましたが、 'javax.net.ssl.SSLSocketFactory'と互換性がありません。私は 'ClassCastException'を取得します: ' org.apache.http.conn.ssl.SSLSocketFactoryはjavax.net.ssl.SSLSocketFactory'にキャストできません これを行う最も簡単な方法は何ですか? – hpityu
@hpityu Webサービスコールの作成にどのライブラリを使用していますか? Apacheの 'SSLSocketFactory'インスタンスを' javax.net.ssl.SSLSocketFactory'を待っているどこかにドロップすることはできません。これは、Apacheが提供する 'HttpClient'での使用のために設計されています。アプリケーションによっては、(1)クライアントコードを 'HttpClient'を使用するように書き直すこと、(2)Apache' SSLSocketFactory'をラップして 'javax.net.ssl.SSLSocketFactory'を実装するアダプタを書くことができるかもしれません。 – Alex