协商版本怎么看
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.type | 1=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 摘要与关键帧,写明工具版本与抓包位置