【问题标题】:SSLEngine ShutdownSSLEngine 关闭
【发布时间】:2014-04-16 13:08:46
【问题描述】:

SSLEngine documentation 指示如何正确关闭 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?

我错过了什么?文档的这两部分不是矛盾的吗?

【问题讨论】:

    标签: java ssl sslengine


    【解决方案1】:

    我不认为文档的这两部分相互矛盾。

    当您到达输入数据的末尾时,您应该调用 engine.closeInbound()

    这适用于完全关闭和切断的连接。当连接被切断时,将抛出异常(即,如果您在收到close_notify 之前调用它)。 如果收到close_notify(或者连接根本没有开始),则不会抛出此异常。

    我不太确定你是如何进行简单关机测试的,但你应该先从另一端发送close_notify(例如closeOutbound())。在这种情况下,您不应该在收到socketChannel.read() 之前收到来自socketChannel.read() 的-1(那时您不会收到异常)。

    (以防万一,前一阵子有一个similar question on SSLSocket。)

    【讨论】:

    • +1 感谢您的澄清以及您提供的链接上的详细记录答案。我希望我能同时接受你的回答和 EJP 的回答,因为两者都对我有同样的帮助。我接受了你的,因为如果是第一个。
    【解决方案2】:

    你看错了。

    基本上如果链接被切断,closeInbound() 应该被调用。

    根本没有这么说。

    它说closeInbound() 方法应该总是在“输入数据结束时”被调用,然后它会检测任何断开的连接.

    如果没有收到close_notify,则会抛出异常。

    【讨论】:

    • +1 感谢您的澄清并明确说明 closeInbound 将检测断开的连接,确认异常并非意外。
    猜你喜欢
    • 2016-08-05
    • 2019-04-07
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多