SSLEngine 文档说明了如何正确关闭 SSL 连接。更具体地说,它提供了有关如何处理断开连接的说明:
除了有序关闭之外,还可能存在无序关闭,其中传输链路在关闭消息交换之前被切断。在前面的示例中,应用程序在尝试读取或写入非阻塞 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?
我错过了什么?文档的这两部分不是矛盾的吗?