次の行のように、ポート443にソケットを作成しました。
socket = (SSLSocket) factory.createSocket(hostName, port);
次に、このソケットで有効な暗号スイートを確認したかったので、次を使用しました。
String[] enCiphersuite=socket.getEnabledCipherSuites();
System.out.println("Enabled ciphersuites are: "+Arrays.toString(enCiphersuite));
次に、リモートサーバーでハンドシェイクを作成するときにアプリケーションで使用する暗号スイートを1つだけ選択します。私は次のことをしました:
String pickedCipher[] ={"TLS_RSA_WITH_AES_128_CBC_SHA"};
socket.setEnabledCipherSuites(pickedCipher);
System.out.println("ciphersuite set to: "+Arrays.toString(pickedCipher));
次に、ハンドシェイクを行い、セッション暗号スイートを確認しました。
socket.startHandshake();
System.out.println("Session ciphersuite is"+socket.getSession().getCipherSuite() );
しかし、ハンドシェイク後に前のプリントアウトステートメントで印刷された暗号の名前(私が理解しているように、これはセッションで実際に使用されている暗号です)は、以前に使用して設定したものではないことがわかりましたsetEnabledCipherSuites()
選択した暗号スイートが使用済みの暗号スイートであることがまだ表示されないのはなぜですか?また、リストが設定したものに変更されていないことを確認getEnabledCipherSuites()
した後、印刷してみました。setEnabledCipherSuites
有効な暗号スイートをいつ印刷するかわかりません。この暗号スイートのリストはJavaに依存していて、常に同じリストですか、それともクライアントまたはサーバーに依存していますか?どんな体でも説明できますか?
編集: 握手の前に私は次の行しかありません:
SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory();
SSLSocket socket=null;
try {
socket = (SSLSocket) factory.createSocket(hostName, port);
socket.setSoTimeout(15000);
socket.startHandshake(); //handshake
.
.