为何Wireshark无法将自定义ClientHello识别为TLS 1.3?
问题:构造的TLS 1.3 ClientHello被Wireshark识别为TLS 1.2
为研究目的构造了TLS 1.3的ClientHello数据包,能被正常识别但Wireshark始终判定为TLS 1.2版本,相关数据如下:
完整帧原始数据包
0000 02 00 00 00 45 02 00 af a7 f2 40 00 80 06 00 00 0010 7f 00 00 01 7f 00 00 01 c4 0f d4 31 4f 7f e8 b3 0020 13 d7 3d b8 50 18 20 fa 1f 5c 00 00 16 03 03 00 0030 82 01 00 00 7e 03 03 31 32 33 34 35 36 37 38 39 0040 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 0050 36 37 38 39 30 31 32 20 31 32 33 34 35 36 37 38 0060 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 0070 35 36 37 38 39 30 31 32 00 04 13 03 13 04 01 00 0080 00 31 00 33 00 26 00 24 00 1d 00 20 e8 c6 6d fc 0090 ee 62 22 8d 82 d2 78 dd d5 1c 0b 92 3e 03 9f 00 00a0 d1 11 63 b8 7c 77 3f f7 a8 72 b9 47 00 2b 00 03 00b0 02 03 04
TLS起始原始数据包
0000 16 03 03 00 82 01 00 00 7e 03 03 31 32 33 34 35 0010 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 0020 32 33 34 35 36 37 38 39 30 31 32 20 31 32 33 34 0030 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 0040 31 32 33 34 35 36 37 38 39 30 31 32 00 04 13 03 0050 13 04 01 00 00 31 00 33 00 26 00 24 00 1d 00 20 0060 e8 c6 6d fc ee 62 22 8d 82 d2 78 dd d5 1c 0b 92 0070 3e 03 9f 00 d1 11 63 b8 7c 77 3f f7 a8 72 b9 47 0080 00 2b 00 03 02 03 04
Wireshark解析结果
Frame 16287: 179 bytes on wire (1432 bits), 179 bytes captured (1432 bits) on interface \Device\NPF_Loopback, id 0 Null/Loopback Family: IP (2) Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1 Transmission Control Protocol, Src Port: 50191, Dst Port: 54321, Seq: 1, Ack: 1, Len: 135 Transport Layer Security TLSv1.2 Record Layer: Handshake Protocol: Client Hello Content Type: Handshake (22) Version: TLS 1.2 (0x0303) Length: 130 Handshake Protocol: Client Hello Handshake Type: Client Hello (1) Length: 126 Version: TLS 1.2 (0x0303) Random: 3132333435363738393031323334353637383930313233343536373839303132 Session ID Length: 32 Session ID: 3132333435363738393031323334353637383930313233343536373839303132 Cipher Suites Length: 4 Cipher Suites (2 suites) Compression Methods Length: 1 Compression Methods (1 method) Extensions Length: 49 Extension: key_share (len=38) Type: key_share (51) Length: 38 Key Share extension Client Key Share Length: 36 Key Share Entry: Group: x25519, Key Exchange length: 32 Group: x25519 (29) Key Exchange Length: 32 Key Exchange: e8c66dfcee62228d82d278ddd51c0b923e039f00d11163b87c773ff7a872b947 Extension: supported_versions (len=3) Type: supported_versions (43) Length: 3 Supported Versions length: 2 Supported Version: TLS 1.3 (0x0304) [JA3 Fullstring: 771,4867-4868,51-43,,] [JA3: cfa5afddedc4688ce18a7378a388d916]
期望Wireshark能正确识别该数据包为TLS 1.3版本。
原因与解决方法
核心原因
这是TLS 1.3协议本身的向后兼容设计导致的:
- TLS 1.3的ClientHello在Record Layer和Handshake结构的Version字段中,必须使用
0x0303(即TLS 1.2的版本号),目的是让不支持TLS 1.3的老服务器能识别并处理这个握手包。 - Wireshark的解析逻辑会优先根据Record Layer的Version字段标记协议版本,所以会显示为TLSv1.2 Record Layer,但实际上它已经识别到了
supported_versions扩展中的TLS 1.3(从解析结果里的Extension部分可以看到)。
让Wireshark正确识别为TLS 1.3的调整
如果你希望Wireshark将整个握手包标记为TLS 1.3,需要做以下调整:
- 完善
supported_versions扩展内容:协议允许只指定TLS 1.3,但部分解析工具期望同时包含TLS 1.2(0x0303),即扩展内容改为02 0303 0304(对应调整扩展长度字段),这样Wireshark会更明确地识别出这是一个TLS 1.3的握手请求。 - 升级Wireshark版本:较旧版本的Wireshark对TLS 1.3的解析支持可能不完善,升级到最新版本可以提升识别准确性。
补充说明
实际上你的ClientHello完全符合TLS 1.3规范,Wireshark只是在Record Layer的显示上沿用了字段中的版本号,它已经正确识别了supported_versions和key_share这些TLS 1.3特有的扩展。如果服务器支持TLS 1.3,后续的握手流程会正常协商到TLS 1.3版本,此时Wireshark也会将后续的Record标记为TLS 1.3。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

