SSLEngineのドキュメントには、SSL 接続を適切に閉じる方法が示されています。より具体的には、切断された接続を処理する方法について説明します。
正常なシャットダウンに加えて、クローズ メッセージが交換される前にトランスポート リンクが切断される非正常なシャットダウンも発生する可能性があります。前の例では、非ブロッキング SocketChannel に対して読み取りまたは書き込みを試行すると、アプリケーションは -1 を取得する可能性があります。入力データの最後に到達したら、engine.closeInbound() を呼び出す必要があります。これにより、リモート ピアが SSL/TLS の観点から正常に閉じられたことを SSLEngine で検証します。その後、アプリケーションは引き続き正常にシャットダウンを試行する必要があります。上記の手順を使用して。
基本的に、リンクが切れた場合はengine.closeInbound()
呼び出す必要があります。ただし、このcloseInbound()メソッドのドキュメントには、ピアから適切な終了メッセージを受信する前に呼び出された場合、例外がスローされることが示されています。接続が切断された場合、この close_notify メッセージは決して受信されないように思われるため、このメソッドは常にその例外をスローします。
私はテストを行い、socketChannel.read()
-1 を返す単純なシャットダウン プロシージャを作成しました。呼び出すengine.closeInbound()
と、実際に次の例外が発生します。
javax.net.ssl.SSLException: Inbound closed before receiving peer's close_notify: possible truncation attack?
私は何が欠けていますか?ドキュメントのこれら 2 つの部分は矛盾していませんか?