我正在使用TLS 1.3通过java http客户端访问TLS 1.3测试服务器“ https://tls13.pinterjann.is”。正如html响应所指示的那样,一切似乎都可以正常工作:



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

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

谢谢您的支持。






评论

您的Wireshark副本是否最新?

是的,我正在使用Wireshark版本2.6.5。

有趣的是,它在一行中表示1.3,然后在另一行中表示1.0,然后在另一行中表示1.2。您是否尝试过其他捕获工具,例如Fiddler?

不,我没有尝试其他捕获工具。 Fiddler是否支持显示TLS 1.3消息?

顺便说一句:我在互联网上发现了这个捕获的cloudshark.org/captures/64d433b1585a,发生了同样的事情。我想这是Wireshark在详细信息部分中显示版本的一种不准确之处。

#1 楼

抱歉,对于我的困惑,我缺少确切的TLS 1.3语义:例如,在客户端Hello中,字段“版本”必须包含固定值0x0303(TLS 1.2),而首选版本包含在扩展名“支持”中。版本”。

来自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,即版本
legacy_version为0x0303和supported_versions扩展
,其中以0x0304作为其中指示的最高版本。
(有关向后兼容性的详细信息,请参阅附录D。)


这与Wireshark显示的内容一致:



评论


好发现。恭喜。

– Jesse P.
18/12/31在6:09

这是4天前在35C3上的一次演讲中涉及的:media.ccc.de/v/…“版本不宽容”问题似乎在“企业”设备上相当普遍

–cg909
18/12/31在13:19

#2 楼


为什么Wireshark为什么在协议TLSv1.3的概述中显示,但在版本TLS 1.2的详细信息中显示?
由于服务器Hello包含受支持的内容,Wireshark在协议列中报告了TLS 1.3。 TLS 1.3的版本扩展。回想一下,TLS会话以握手开始,以协商诸如协议版本和密码之类的参数。客户端在TLS记录中发送“客户端问候”握手消息,该消息包含:


TLS记录-版本:支持的最低TLS版本(在TLS 1.2及更低版本中)。在TLS 1.3中,并未真正使用此字段,出于兼容性目的,该字段必须为0x0303(“ TLS 1.2”)或0x301(“ TLS 1.0”)。参考:RFC 8446(第79页)

Client Hello-版本:支持的最大TLS版本(在TLS 1.2及更低版本中)。在TLS 1.3中,不使用此字段,但必须将其设置为0x0303(“ TLS 1.2”)。参考:RFC 8446(4.1.2。Client Hello)

Client Hello-支持的版本扩展:支持的版本列表。这是TLS 1.3实现(可能同意TLS 1.3、1.2或其他版本)使用的唯一值。参考:RFC 8446(4.2.1。支持的版本)


服务器发送服务器Hello握手消息,其内容为:


Server Hello-版本:议定版本(适用于TLS 1.2及更低版本)。如果已协商TLS 1.3,则必须将其设置为0x0303(“ TLS 1.2”)。
服务器Hello-支持的版本:单个协商的版本(用于TLS 1.3)。无法用于协商早期版本。

因此,在TLS 1.2中,客户端发送一系列受支持的版本,而TLS 1.3客户端发送受支持的版本的列表。然后,服务器将选择一个版本,但是出于兼容性目的,它将使用一个新字段来选择TLS 1.3或更高版本。

(即使客户端宣传支持某个版本(例如通过TLS记录)包含“ TLS 1.0”的版本),即使服务器同意此低版本,它仍然可能无法通过握手。)

要注意的另一件事:Wireshark尝试在接收到数据包后立即解释它。在收到客户端Hello时,它将不知道最终版本,因此采用TLS记录版本。收到服务器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/测试/捕获/tls13-rfc8446.pcap