为什么 Wireshark 在这里显示版本 TLS 1.2 而不是 TLS 1.3?

网络工程 线鲨
2021-07-20 17:35:48

我正在通过使用 TLS 1.3 的 java http 客户端访问 TLS 1.3 测试服务器“ https://tls13.pinterjann.is ”。一切似乎都正常,因为 html 响应表明:

HTML 响应

我不明白的是:为什么 Wireshark 显示在概述协议 TLSv1.3 中,但在详细信息中显示版本 TLS 1.2?

Wireshark 只是显示错误的版本还是我实际上使用的是 TLS 1.2?

预先感谢您的支持。

Wireshark 客户端Hello Wireshark HelloRetry Wireshark 客户端Hello 2 Wireshark 服务器你好

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 支持的版本

为什么 Wireshark 在概览中显示协议 TLSv1.3,但在详细信息中显示 TLS 1.2 版本?

由于 Server Hello 包含支持TLS 1.3支持版本扩展Wireshark 在协议列中报告TLS 1.3。

回想一下,TLS 会话以握手开始以协商诸如协议版本和密码之类的参数。客户端在 TLS 记录中发送一个 Client Hello 握手消息,其中包含:

  • TLS 记录 - 版本:支持的最低 TLS 版本(在 TLS 1.2 及之前)。在 TLS 1.3 中,该字段并未真正使用,出于兼容性目的,该字段必须为 0x0303(“TLS 1.2”)或 0x301(“TLS 1.0”)。参考:RFC 8446(第 79 页)
  • 客户端问候 - 版本:支持的最大 TLS 版本(在 TLS 1.2 及之前)。在 TLS 1.3 中,不使用此字段,但必须将其设置为 0x0303(“TLS 1.2”)。参考:RFC 8446(4.1.2. 客户端问候)
  • Client Hello - Supported Versions Extension:支持版本列表。这是 TLS 1.3 实现(可能同意 TLS 1.3、1.2 或其他版本)使用的唯一值。参考:RFC 8446(4.2.1。支持的版本)

服务器发送一个 Server Hello 握手消息:

  • 服务器问候 - 版本:协商版本(适用于 TLS 1.2 及更早版本)。如果协商 TLS 1.3,则必须将其设置为 0x0303(“TLS 1.2”)。
  • 服务器问候 - 支持的版本:单个协商版本(用于 TLS 1.3)。不能用于协商早期版本。

因此,在 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