我不明白的地方:为什么Wireshark在概述TLSv1.3协议中显示了详细信息TLS 1.2版本?
Wireshark只是显示了错误的版本,还是我实际上在使用TLS 1.2?
谢谢您的支持。
#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
评论
您的Wireshark副本是否最新?是的,我正在使用Wireshark版本2.6.5。
有趣的是,它在一行中表示1.3,然后在另一行中表示1.0,然后在另一行中表示1.2。您是否尝试过其他捕获工具,例如Fiddler?
不,我没有尝试其他捕获工具。 Fiddler是否支持显示TLS 1.3消息?
顺便说一句:我在互联网上发现了这个捕获的cloudshark.org/captures/64d433b1585a,发生了同样的事情。我想这是Wireshark在详细信息部分中显示版本的一种不准确之处。