为什么 TLS 需要明确的心跳协议?

信息安全 tls
2021-08-17 13:26:52

TLS 协议的心跳扩展对于 DTLS 来说似乎是一个有用的想法。根据规范本身,它可用于在没有重新协商的情况下确定对等方是否仍然存在(并防止防火墙断开连接)以及用于路径 MTU 发现。

但是,我不明白为常规的基于 TCP 的 TLS 指定和实现它的动机。发送空的应用程序数据片段难道不能从根本上解决状态防火墙丢弃空闲连接的问题吗?

TLS 的 RFC明确允许这种行为:

可以发送应用程序数据的零长度片段,因为它们可能用作流量分析对策。

3个回答

心跳有两个目的:进行一些链接级别的活动(避免被热心的防火墙关闭)确保对等点仍然活着。如果您想同时使用空片段,那么您需要在客户端和服务器之间进行一些约定,以便当您发送一个空片段时,对等方会以一个空片段进行响应。如果没有正确完成,这可能会导致无限循环。

此外,当使用空片段作为 BEAST 攻击的对策时,一些广泛部署的实现似乎遇到了问题。这就是我们进行“1/n-1 拆分”而不是“0/n”拆分的原因。

因此,心跳扩展主要是这种类似 ping 的约定的形式化,具有自己的初始协商和格式,因此不会出现互操作性问题。

基于 TLS 的实现的主要好处是相同的 SSL 记录处理代码可用于 TLS 和 DTLS。否则,您的 SSL 记录处理代码需要了解底层传输机制。

另一个用途是用于多流可靠传输协议,您可以在该协议上使用 TLS。RFC 中的示例是 SCTP。在这种情况下,有一些用处。

它在 TCP 上的实际使用几乎为零。

TCP 已经有保活(如果存在这个要求,每个 TCP 连接都必须防范“热心防火墙”),所以在 SSL 中重新保活是没有用的。