我正在通过使用 TLS 1.3 的 java http 客户端访问 TLS 1.3 测试服务器“ https://tls13.pinterjann.is ”。一切似乎都正常,因为 html 响应表明:
我不明白的是:为什么 Wireshark 显示在概述协议 TLSv1.3 中,但在详细信息中显示版本 TLS 1.2?
Wireshark 只是显示错误的版本还是我实际上使用的是 TLS 1.2?
预先感谢您的支持。
我正在通过使用 TLS 1.3 的 java http 客户端访问 TLS 1.3 测试服务器“ https://tls13.pinterjann.is ”。一切似乎都正常,因为 html 响应表明:
我不明白的是:为什么 Wireshark 显示在概述协议 TLSv1.3 中,但在详细信息中显示版本 TLS 1.2?
Wireshark 只是显示错误的版本还是我实际上使用的是 TLS 1.2?
预先感谢您的支持。
抱歉,由于混淆,我错过了确切的 TLS 1.3 语义:例如,在 Client Hello 中,字段“version”必须包含固定值 0x0303 (TLS 1.2),而首选版本包含在扩展“supported”中版本”。
来自 RFC 8446(TLS 1.3 规范):
struct {
ProtocolVersion legacy_version = 0x0303; /* TLS v1.2 */
Random random;
opaque legacy_session_id<0..32>;
CipherSuite cipher_suites<2..2^16-2>;
opaque legacy_compression_methods<1..2^8-1>;
Extension extensions<8..2^16-1>;
} ClientHello;
legacy_version:在以前的 TLS 版本中,该字段用于版本协商,代表客户端支持的最高版本号。经验表明,许多服务器没有正确实现版本协商,导致“版本不容忍”,其中服务器拒绝版本号高于其支持的其他可接受的 ClientHello。在 TLS 1.3 中,客户端在“supported_versions”扩展(第 4.2.1 节)中指示其版本首选项,并且 legacy_version 字段必须设置为 0x0303,这是 TLS 1.2 的版本号。TLS 1. 3 ClientHellos 被标识为具有 legacy_version 0x0303 和 supported_versions 扩展,其中 0x0304 作为其中指示的最高版本。(有关向后兼容性的详细信息,请参阅附录 D。)
这与 Wireshark 显示的内容一致:
为什么 Wireshark 在概览中显示协议 TLSv1.3,但在详细信息中显示 TLS 1.2 版本?
由于 Server Hello 包含支持TLS 1.3的支持版本扩展,Wireshark 在协议列中报告TLS 1.3。
回想一下,TLS 会话以握手开始以协商诸如协议版本和密码之类的参数。客户端在 TLS 记录中发送一个 Client Hello 握手消息,其中包含:
服务器发送一个 Server Hello 握手消息:
因此,在 TLS 1.2 中,客户端发送一系列支持的版本,而 TLS 1.3 客户端发送支持版本的列表。然后服务器将选择单个版本,但出于兼容性目的,它将使用一个新字段来选择 TLS 1.3 或更高版本。
(即使客户端宣传对某个版本的支持(例如,通过包含“TLS 1.0”的 TLS 记录版本),但如果服务器同意此低版本,它仍然可能会失败握手。)
另一件需要注意的事情:Wireshark 尝试在收到数据包时立即对其进行解释。在收到 Client Hello 时,它不会知道最终版本,因此会假定 TLS 记录版本。当收到 Server Hello 时,它可以相应地调整版本:
$ tshark -r test/captures/tls13-rfc8446.pcap
1 0.000000 10.9.0.1 → 10.9.0.2 TLSv1 304 Client Hello
2 0.002634 10.9.0.2 → 10.9.0.1 TLSv1.3 658 Server Hello, Change Cipher Spec, Application Data
3 0.005266 10.9.0.1 → 10.9.0.2 TLSv1.3 130 Change Cipher Spec, Application Data
4 0.005772 10.9.0.2 → 10.9.0.1 TLSv1.3 468 Application Data
...
在两次解析中(还包括 Wireshark GUI),当它打印第二次传递的结果时,将知道同意的版本:
$ tshark -r test/captures/tls13-rfc8446.pcap -2
1 0.000000 10.9.0.1 → 10.9.0.2 TLSv1.3 304 Client Hello
2 0.002634 10.9.0.2 → 10.9.0.1 TLSv1.3 658 Server Hello, Change Cipher Spec, Application Data
3 0.005266 10.9.0.1 → 10.9.0.2 TLSv1.3 130 Change Cipher Spec, Application Data
4 0.005772 10.9.0.2 → 10.9.0.1 TLSv1.3 468 Application Data
...
上面使用的测试捕获:https : //github.com/wireshark/wireshark/blob/master/test/captures/tls13-rfc8446.pcap