应用层报文判读71 条

协商版本判读

以 ServerHello 的 supported_versions 或 version 字段为准:客户端想 1.3、服务端最高 1.2 时按 1.2 运行,策略合规检查看这里。

协商版本怎么看

TLS 的实际版本是握手里协商出来的,不是客户端单方面决定。ClientHello 用 supported_versions 扩展列出自己支持的版本清单(同时把记录层的 legacy_version 固定写成 0x0303 做兼容),ServerHello 从清单里选一个,用同一个扩展回给客户端,此后整条连接都跑这个版本。TLS 1.2 及更早没有这个扩展,版本写在 ClientHello/ServerHello 的 version 字段里。判断「实际用了哪个版本」,以 ServerHello 为准。

基本信息

适用平台Linux / Windows 上的 Wireshark 4.x、tshark
关键字段tls.handshake.extensions.supported_version、tls.handshake.version
记录层版本1.3 恒为 0x0303,不代表协商结果
读取位置ClientHello(type=1)与 ServerHello(type=2)

典型使用场景

  • 合规核查:等保、PCI DSS 要求 TLS 1.2 以上,需要给出实际协商版本作为证据
  • 排错:客户端报「协议版本不受支持」,核对两端版本清单有没有交集
  • 变更验证:禁用 TLS 1.0/1.1 后确认线上不再出现旧版本会话
  • 灰度对比:新旧两套网关对同一批客户端的协商结果差异
  • 容量评估:统计各版本会话占比,估算升级影响面

命令行核对

命令行核对
tshark -r t.pcap -Y "tls.handshake.type==2" -T fields -e ip.dst -e tls.handshake.extensions.supported_version -e tls.handshake.version
# 只看 ServerHello:第二列才是协商版本(1.3 在扩展里),第三列是记录层版本
tshark -r t.pcap -Y "tls.handshake.type==1" -T fields -e tls.handshake.extensions.supported_version
# ClientHello 侧列出客户端支持范围,用来判断「有没有交集」

字段逐项读法

字段含义判读要点
tls.handshake.version报文头里的版本号1.3 固定显示 0x0303,据此判版本必错
supported_version(扩展)服务端真实选中版本ServerHello 中出现即以此为准
supported_versions(ClientHello)客户端支持的版本清单清单与服务端策略无交集时握手失败
handshake.type1=ClientHello、2=ServerHello确认自己取的是服务端应答而不是请求
会话恢复不重新协商版本:TLS 1.2 用 Session ID / Ticket、1.3 用 PSK 恢复时,版本沿用原会话。按版本统计流量占比时,恢复流量会归到原版本,不能代表本轮客户端能力。
只看握手第一条 Record 的 version 字段会得出错误结论:TLS 1.3 为了穿越中间设备,记录层一律报 0x0303,真实选择藏在 supported_versions 扩展里。

排错顺序

  • 第一步确认对象:过滤出 ServerHello,按 SNI 或目的 IP 分组,避免把多个虚拟主机混在一起看
  • 第二步读协商版本与告警码:有 Alert 先看 desc,40 与 70 都指向两端参数不匹配
  • 第三步核对客户端清单:ClientHello 的 supported_versions 是否包含服务端要求的版本
  • 第四步核对中间设备:TLS 终止型负载均衡两端分别抓包,比较两侧实际版本
  • 第五步留证据:附上 capinfos 摘要与关键帧,写明工具版本与抓包位置

易错点

  • 拿记录层 version 当协商结果:TLS 1.3 会被误判成 1.2,合规报告直接出错
  • 只统计 ClientHello 的版本清单就下结论:客户端支持不等于实际使用,必须看 ServerHello
  • 把握手失败一律归为版本问题:无共同版本通常返回 protocol_version(70) 或 handshake_failure(40) 告警,先看告警码再定责
  • 忽略中间设备改写:TLS 终止型负载均衡两端版本可以不同,要按段分别抓包

数据来源与参考

  • RFC 8446(版本协商)
  • RFC 5246
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌