2012-04-16 6 views
2

次の問題があります。私は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を呼び出すときにクライアント側の証明書を動的に変更するにはどうすればよいですか?

答えて

3

私は、SSLソケットファクトリにデフォルトのJSSE SSLContextを使用しているいくつかの方法を使用していると思われます。 documentationから、SSLコンテキストは最初に作成されたときに一度だけ設定され、最初の使用後にシステムプロパティを設定しても効果がないように見えます。

Apache HttpClientの使用をお勧めします。彼らのSSLSocketFactory実装では、キーストアとトラストストアをプログラムでカスタマイズして、そのファクトリとの接続に使用することができます。さらに、HttpClientは、JDKの箱からすぐに入手できるものよりも多くの機能と設定オプションを提供します。

+0

+1 SSLコンテキストは一度しか設定されません – jaxb

+0

SSLSocketFactoryを使用しようとしましたが、 'javax.net.ssl.SSLSocketFactory'と互換性がありません。私は 'ClassCastException'を取得します: ' org.apache.http.conn.ssl.SSLSocketFactoryはjavax.net.ssl.SSLSocketFactory'にキャストできません これを行う最も簡単な方法は何ですか? – hpityu

+1

@hpityu Webサービスコールの作成にどのライブラリを使用していますか? Apacheの 'SSLSocketFactory'インスタンスを' javax.net.ssl.SSLSocketFactory'を待っているどこかにドロップすることはできません。これは、Apacheが提供する 'HttpClient'での使用のために設計されています。アプリケーションによっては、(1)クライアントコードを 'HttpClient'を使用するように書き直すこと、(2)Apache' SSLSocketFactory'をラップして 'javax.net.ssl.SSLSocketFactory'を実装するアダプタを書くことができるかもしれません。 – Alex

関連する問題