SSL サーバーに接続するには、Java クライアントを作成する必要があります。サーバーは openssl 証明書を使用し、クライアント認証を行うように構成されています。
私 (openssl についても SSL についてもあまり知らない) が、クライアント側の実装を誰に任せるべきかを理解するのに役立つ有用なリソースをオンラインで見つけることができないようです。
ヘルプ!
ここでひねりを加えたのは、クライアント認証を使用しているため、自分自身を識別するための秘密鍵と証明書が必要なことです。SSLContext を初期化するときに KeyManagers を指定することにより、これを JSSE に提供します。
以下は、基本的な手順です。JSSE API は Java 6 で大幅に改善されましたが、Java 5 を使い続けることにします。
KeyStore tks = KeyStore.getInstance(KeyStore.getDefaultType());
tks.load(...); /* Load the trust key store with root CAs. */
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(tks);
KeyStore iks = KeyStore.getInstance(KeyStore.getDefaultType());
iks.load(...); /* Load the identity key store with your key/cert. */
KeyManagerFactory kmf =
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(iks, password);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SocketFactory factory = ctx.getSocketFactory();
Socket socket = factory.createSocket(host, port);
SunJSSE
プロバイダーを使用する場合は、代替の「ゼロ構成」シナリオを使用できます。他の多くのプロバイダー (IBM など) も同じパターンに従っており、同様に機能すると思います。このメカニズムはシステム プロパティを使用し、 JSSE リファレンス ガイドで詳細に説明されています。
クライアント認証の場合、重要なプロパティはjavax.net.ssl.keyStore
とjavax.net.ssl.keyStorePassword
です。値は、それぞれ、ユーザーのキー ストアへのパスと、そのキー ストアの「キー エントリ」のパスワードである必要があります。
これらのプロパティを使用すると、次のようにクライアント認証をサポートする新しい SSLSocket を作成できます。
SocketFactory factory = SSLSocketFactory.getDefault();
Socket socket = factory.createSocket(host, port);
SSLSocketFactory
システム全体のプロパティに依存する「デフォルト」を使用しているため、JVM で作成されたすべてのソケットは同じ証明書で認証されます。それ以上の制御が必要な場合は、上記の「カスタマイズ可能なセットアップ」を使用する必要があります。
Javaでは、標準APIにSSLサポートが含まれています。1.5.0javadocのこれらのクラスを見てください。
通信ロジックを自分で実行している場合はSSLSocket 。
サーバー側がHTTPを話す場合はHttpsURLConnection
httpclient を使用できます。このSSL ガイドをご覧ください。