SSLSocketのドキュメントによると:
ハンドシェイク完了のイベント通知を受信するために登録できます。
なぜあなたはこれに登録しないのですか?SSLExceptionが発生せずにSSLSocket.startHandshake()が成功するという事実は、証明書が信頼できることを保証しますか?または、ハンドシェイクが完了するのを待つことで、ある程度の保証が得られますか?
でハンドシェイクを開始するには、次の 3 つの条件がありますSSLSocket
。
- 明示的にハンドシェイクを開始する startHandshake を呼び出す、または
- このソケットでアプリケーション データを読み書きしようとすると、暗黙的なハンドシェイクが発生します。
- getSession の呼び出しは、現在有効なセッションがない場合にセッションのセットアップを試み、暗黙的なハンドシェイクが行われます。
ハンドシェイクが失敗すると、例外が生成されます (証明書が信頼されていない場合を含む)。
何らかの理由でハンドシェークが失敗した場合、SSLSocket は閉じられ、それ以上の通信はできなくなります。
多くの場合startHandshake()
、入力ストリームからの読み取り (または出力ストリームへの書き込み) を開始するときにハンドシェイクが開始されるため、接続を確立するときに明示的に呼び出す必要はありません。そこで障害が発生すると、例外が発生し、通常の制御フローが停止します。このような場合、ハンドシェイクの完了をキャプチャするために明示的に登録する必要はありません。ストリームから読み書きできる場合は完了です。
ハンドシェイク完了の通知は、サーバーが再ネゴシエーションを要求している場合に最も役立ちます (startHandshake()
一部のアプリケーション データが交換された後に呼び出すことによって)。この場合、先に進む前にそのハンドシェイクが完了するのを待つことができます。たとえば、サーバーが特定のパスの HTTP 要求を受信した後にクライアント証明書を要求する場合、応答を送信する前に、クライアント証明書を承認できるようにハンドシェイクが正常に完了するまで待機する必要がある場合があります。これはstartHandshake()
、アプリケーション データの流れを止めないためです。
接続上でデータがすでに送信されている場合、このハンドシェイク中もデータは流れ続けます。