Client Hello 消息如何选择Record Layer版本?

Client Hello 消息如何选择Record Layer版本?

我有从同一个客户端到不同服务器的两个客户端 Hello 消息,我的客户端支持 TLS 1.2 和 TLS 1.3,如客户端 hello 支持的版本中所示。

在第一条消息中,客户端选择记录层版本 TLS 1.3。 客户端问候 1 - Wireshark 快照

而第二条消息中客户端选择记录层版本TLS 1.2。(客户端只发送了hello并收到了alert) 客户端问候 2 - Wireshark 快照

客户端真的选择了版本吗?如果是,那么在客户端尚未收到 Server Hello 消息的情况下,客户端是如何决定版本的。

或者Wireshark是否根据他在server hello中看到的内容来设置版本?

这该如何解释呢?

答案1

Wireshark 在以下上下文中看到 ClientHello:下列的数据包。如果握手结果是通用版本的 TLS 1.2,则将显示 TLS 1.2 记录层;如果是 TLS 1.3,则将显示 TLS 1.3 记录层。如果仅将数据包导出到 ClientHello,Wireshark 还无法查看将使用哪个版本(因为尚未收到服务器的回复),然后 Wireshark 甚至会仅显示 TLSv1 记录层,即使这与之前的 ClientHello 完全相同:

在此处输入图片描述

答案2

或者 wireshark 是否根据他在 server hello 中看到的内容设置版本?

是的。标题行是 Wireshark 对消息的摘要。您可以在消息的详细内容中看到,在两种情况下:

  • 记录协议版本(ClientHello消息之外)为0x0301,这是对应的版本号TLS 1.0. 已在TLS 1.2,ClientHello 消息的记录层版本可以是 0x0303(TLS 1.2)或 0x0301(TLS 1.0)为了向后兼容
  • 消息协议版本(ClientHello 消息内)是0x0303,这是对应于TLS 1.2的版本号在 TLS 1.0 到 1.2 中,这通常是客户端支持的最高协议版本,服务器通常使用它支持的最高版本进行回复(如果是旧版本,则不一定知道客户端是否支持它)。在TLS 1.3,此字段已更改为仅用于向后兼容目的,并且supports_versions 扩展是强制性的。
  • 在里面supports_versions 扩展,客户端表明它同时支持0x0303(TLS 1.2)和0x0304(TLS 1.3)。

TLS 1.3 规范解释了这些奇怪的版本号指示的原因。它主要与向后兼容性有关,允许客户端宣传 TLS 1.3 支持,同时仍然能够联系仅支持旧版本的服务器。向后兼容性约束不仅与服务器有关,还与防火墙和其他网络设备有关,这些设备只允许它们认为是“良好”TLS 的流量通过。相当多的软件拒绝高于它们所知道的“良好”版本的版本号,如果 TLS 1.3 使用逻辑版本号,这将阻止 TLS 1.3 流量。

顺便说一句,TLS 1.0 的版本号为 3.1,TLS 1.1 的版本号为 3.2,TLS 1.2 的版本号为 3.3,TLS 1.3 的版本号为 3.4,这些原因都是类似的。TLS 1.0 除了名称之外,其余都是 SSL v3.1,因为与 SSL 3.0 相比,它只有相当小的修改,并且将主版本号保持在 1 可以更容易地实现向后兼容。TLS 1.3 与以前的版本有如此多的不同,以至于将其称为 2.0 是有道理的,但协议内部的主版本指示必须保持为 1,以避免被过度受限的软件拒绝。

相关内容