12

次の行のように、ポート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
.
.
4

1 に答える 1

6

有効な暗号を設定する前に出力するために、setEnableCipherSuite()の前にsocket.getsession()を追加したことがわかりました。削除すると暗号が設定されています。何故ですか ?

SSLSocketJavaDocに記載されているように:

この接続の最初のハンドシェイクは、次の3つの方法のいずれかで開始できます。

  • ハンドシェイクを明示的に開始するstartHandshakeを呼び出す、または
  • このソケットでアプリケーションデータを読み書きしようとすると、暗黙的なハンドシェイクが発生します。
  • getSessionの呼び出しは、現在有効なセッションがない場合にセッションのセットアップを試み、暗黙のハンドシェイクが実行されます。

を呼び出すgetSession()前に呼び出す場合setEnabledCipherSuite()、有効な暗号スイートを設定しようとするとハンドシェイクがすでに実行されているため、このセッションの暗号スイートはすでに選択されています。

于 2012-12-22T23:29:12.593 に答える