4

addHandshakeListener()メソッドを使用せずに、ハンドシェイクが完了するまでSSLSocketを待機させる方法はありますか?ハンドシェイクが完了するまでブロックしてほしい。

編集:もう少し明確に:通常の(非SSL)ソケットが最初に使用されます(実際のハンドシェイクが行われる前にパッケージをサーバーに送信する必要があるため、これは必須です)。このソケットは、 SSlSocketFactory.createSocketを使用してSSLSocketに「変換」されます。私の質問は、ハンドシェイクを同期的に実行する方法があるかどうかです。

4

1 に答える 1

7

SSLSocket.startHandshake() は、ピア間で初めてハンドシェイクを開始するときの同期呼び出しであり、ハンドシェイクが完了するまで呼び出しスレッドをブロックします。

... ...

// initial handshake between peers, don't need Listener:
sslSocket.startHandshake(); // <- this will block the calling thread.
// handshake is completed at this point

... ...

これはAndroid APIで完全に文書化されていません。完全な javadoc については、元のJava APIを参照してください。

この接続で SSL ハンドシェイクを開始します。一般的な理由には、新しい暗号化キーを使用する必要がある、暗号スイートを変更する、または新しいセッションを開始する必要があるなどがあります。完全な再認証を強制するために、このハンドシェイクを開始する前に現在のセッションを無効にすることができます。

接続上でデータがすでに送信されている場合、このハンドシェイク中もデータは流れ続けます。ハンドシェイクが完了すると、イベントで通知されます。このメソッドは、接続の最初のハンドシェイクに対して同期的であり、ネゴシエートされたハンドシェイクが完了すると戻ります。一部のプロトコルは、既存のソケットで複数のハンドシェイクをサポートせず、IOException をスローする場合があります。

ピア間でハンドシェイクを複数回操作すると、状況がかなり複雑になります。場合によっては非同期呼び出しになる可能性があります (リスナーが必要な場合)。詳細については、このオンライン ドキュメントFundamental Networking in Javaを参照してください。

于 2012-10-30T21:48:29.103 に答える