TLS 握手失败,但通信未关闭

Posted

技术标签:

【中文标题】TLS 握手失败,但通信未关闭【英文标题】:TLS handshake fail, but communication is not closed 【发布时间】:2021-08-26 11:35:15 【问题描述】:

我有 TLS 程序,并对其进行了一些实验。

我启动机密 TLS 服务器会话并尝试使用纯 Telnet 客户端连接到它。

正如预期的那样,握手失败并且服务器可供下一个客户端使用,但在 Telnet 客户端上,我没有收到任何关于握手失败并且服务器正在接受其他客户端的指示。 我可以在 Wireshark 中看到,即使在握手失败之后 Telnet 客户端也可以发送字符串;我看到来自客户端的 [PSH, ACK] 由服务器的 [ACK] 回答。

添加 Wireshark 快照,Telnet 握手失败,Telnet 继续发送消息,随后 TLS 握手成功和更多 Telnet 消息:

如果握手失败并且他正在接受其他客户端,为什么服务器会确认 Telnet 客户端?

【问题讨论】:

“我没有收到任何迹象表明......服务器正在接受其他客户端”:你永远不会。无法想象你在这里期待什么。 大部分都是假的。 (1) 这不是一个“纯 Telnet 客户端”;它说的是 TLS。 (2) Telnet 客户端收到 TLS 警报,这是“握手失败的指示”。 (3) 没有“表明服务器正在 [或不] 接受其他客户端的迹象”这样的事情。 (4) Telnet 客户端然后收到一个 FIN。 (4) Telnet 客户端收到一个 RST。在此之后,连接不再存在。我无法解释以下内容:它真的是同一流的一部分吗?此时有一个相当可疑的 3 秒间隔。 【参考方案1】:

果然,握手失败了……

我在数据包捕获中看不到失败的 TLS 握手,我不确定您是如何得出这个结论的。

我只能看到源端口 60198 上的客户端(可能是您的 telnet)多次发送 3 个字节,而服务器只是确认这些字节,而没有发回任何内容,也没有关闭连接。服务器可能仍在等待数据,希望在某个时候它会成为完整的 TLS 记录。只有这样它才会被 TLS 堆栈处理,然后它可能会意识到客户端有问题。

...服务器可供下一个客户端使用

服务器并行处理多个客户端是很正常的。相反,如果服务器无法做到这一点,那将是不寻常的。

【讨论】:

感谢@steffen,服务器处理多个客户端是正常的,但我希望服务器在握手失败后关闭通信。 @lior.i: "...但我希望服务器在握手失败后关闭通信" - 但握手并没有失败(还)。服务器仍在等待 ClientHello 完成。这就是服务器没有关闭连接的原因。

以上是关于TLS 握手失败,但通信未关闭的主要内容,如果未能解决你的问题,请参考以下文章

TLS协议的TLS握手协议

fabric之使用传输层安全性(TLS)保护通信安全

HTTPS握手过程

通过完全记录握手来破坏 TLS 安全性

系统安全之数据的加密和解密CA的介绍SSL或TLS协议简介及握手过程

系统安全之数据的加密和解密CA的介绍SSL或TLS协议简介及握手过程