SSLSocket を使用してデータを交換する単純なクライアント/サーバー システムを構築しようとしています。(JavaSE 6) サーバーには独自の証明書が必要ですが、クライアントには必要ありません。
私はこれから始めました http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CreateKeystore サーバーのキーと自己署名証明書を生成するには。要約すると:
Create a new keystore and self-signed certificate with corresponding public/private keys.
keytool -genkeypair -alias mytest -keyalg RSA -validity 7 -keystore /scratch/stores/server.jks
Export and examine the self-signed certificate.
keytool -export -alias mytest -keystore /scratch/stores/server.jks -rfc -file server.cer
Import the certificate into a new truststore.
keytool -import -alias mytest -file server.cer -keystore /scratch/stores/client.jks
次に、サーバーコードで行います
System.setProperty("javax.net.ssl.keyStore", "/scratch/stores/server.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
SSLServerSocketFactory sf = sslContext.getServerSocketFactory();
SSLServerSocket sslServerSocket = (SSLServerSocket)sf.createServerSocket( port );
Socket s = sslServerSocket.accept();
「javax.net.ssl.SSLException: 有効な SSL 暗号スイートに対応する利用可能な証明書またはキーがありません」というメッセージが表示されるため、基本的にいくつかの点が欠けています。サーバーを実行しようとすると。
証明書に問題がある可能性はありますか? keytool で -validity を使用すると、証明書は自己署名されるため、間違っていなければ機能するはずです。
ドキュメントを読むと、SSLContext を正しくセットアップするには、プロパティ「javax.net.ssl.keyStore」を設定するだけで十分なようです。なにか提案を?