SSLEngine documentation指示如何正確關閉SSL連接。更具體地說,它給出瞭如何處理斷開連接的指令:SSLEngine關機
除了有序關閉之外,還可以在關閉消息交換之前切斷傳輸鏈路的無序關閉。在前面的示例中,當嘗試讀取或寫入非阻塞SocketChannel時,應用程序可能會得到-1。當你到達輸入數據的末尾時,你應該調用engine.closeInbound(),它將通過SSLEngine驗證遠程對象已經從SSL/TLS的角度乾淨地關閉,然後應用程序仍然應該嘗試關閉乾淨通過使用上述程序。
基本上,如果鏈接被切斷,應該調用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?
我缺少什麼?這兩份文件不是矛盾的嗎?
+1感謝您澄清並在您提供的鏈接上提供非常詳細的解答。我希望我可以接受你的答案和EJP的答案,因爲這兩者都幫助我平等。我接受你的,因爲如果是第一個。 –