2009-05-20 23 views
6

Javaアプリケーションでは、SSLを使用して同じホストに接続する必要がありますが、毎回異なる証明書を使用します。異なる証明書を使用する必要があるのは、リモートサイトが証明書に埋め込まれたユーザーIDプロパティを使用してクライアントを識別するためです。同じホストでJavaで複数のSSLクライアント証明書を使用する

これは3つの異なるオペレーティングシステムで動作するサーバーアプリケーションであり、プロセスを再起動せずに証明書を切り替える必要があります。

Another user複数の証明書を同じキーストアにインポートすることをお勧めします。しかし、キーストア内のどの証明書をJavaに伝えるかが分かれば、私には分かりません。

答えて

11

SSLは、提示する証明書についてクライアントにヒントを提供できます。このの場合、複数のIDを持つキーストアを1つ使用できますが、残念ながら、ほとんどのサーバーではこのヒント機能は使用されません。したがって、各接続で使用するクライアント証明書を指定すると、より堅牢になります。

特定のIDストアとトラストストアを使用してSSLContextを設定するサンプルコードです。これらの手順を繰り返して、使用するクライアント証明書ごとに1つずつ、複数のコンテキストを作成できます。各SSLContextは、おそらく同じトラストストアを使用しますが、異なるアイデンティティストア(そのコンテキストで使用される単一のクライアントキーエントリを含む)を使用します。

一度必要なコンテキストを初期化し、接続ごとに正しいコンテキストを再利用します。複数の接続を行っている場合は、SSLセッションを利用できます。

KeyManagerFactory kmf = 
    KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
kmf.init(identityStore, password); 
TrustManagerFactory tmf = 
    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
tmf.init(trustStore); 
SSLContext ctx = SSLContext.getInstance("TLS"); 
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 

後で、直接ソケットを作成することができます

SSLSocketFactory factory = ctx.getSocketFactory(); 
Socket socket = factory.createSocket(host, port); 

それとも、あなたがURLクラスを使用している場合、あなたはHTTPSリクエストを作成するときに使用するSSLSocketFactoryを指定することができた:

Java 6には、暗号スイートなどの設定に応じてソケットを簡単に設定できるようにするためのAPIがいくつか追加されています。

+0

「Java 6には、暗号スイートの環境設定に応じてソケットを簡単に設定できるAPIが追加されています」 これらの設定についてさらに詳しく教えてください。 – Tazzy531

+0

@ Tazzy531 - Java 6に['SSLParameters'、](http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/javax/net/ssl/class-use/SSLParameters)が追加されました。 html)です。これは、単一操作で 'SSLEngine'または新しい' SSLSocket'で設定できます。 – erickson

0

Axis ClientからSSL認証に使用されるクライアント証明書を動的に選択するソリューションはhereです。

関連する問題