ServerHello 判读要点
ServerHello 是服务端对 ClientHello 的应答,一次握手里几乎所有选择结果都集中在这一条消息里:协议版本、随机数、会话 ID、选中的密码套件,以及 key_share、ALPN、supported_versions 等扩展。把 ServerHello 与 ClientHello 并排看,就能看清「客户端要什么」和「服务端给什么」之间的差距,是 TLS 排错最先该看的一帧。
基本信息
| 消息类型 | tls.handshake.type == 2,方向服务端到客户端 |
|---|---|
| 关键字段 | tls.handshake.ciphersuite、tls.handshake.extensions_* |
| 1.3 特性 | ServerHello 之后所有消息加密,后续细节需解密 |
| 特例 | HelloRetryRequest 复用 ServerHello 结构,随机数为固定常量 |
典型使用场景
- 核对协商结果:版本、套件、曲线是否与客户端预期一致
- 排查 ALPN 选错:确认最终跑的是 h2 还是 http/1.1
- 确认 SNI 对应证书是否被选中,排查证书串站问题
- 识别 HelloRetryRequest,解释多出来的一次往返
- 多虚拟主机环境下逐台核对实际生效的配置
一条命令取全关键字段
一条命令取全关键字段
tshark -r t.pcap -Y "tls.handshake.type==2" -T fields -e ip.src -e tls.handshake.extensions.supported_version -e tls.handshake.ciphersuite -e tls.handshake.extensions_alpn_str
# 输出:服务端地址 / 协商版本 / 选中套件 / ALPN 结果,用来一眼核对三项选择
tshark -r t.pcap -Y "tls.handshake.type==2 && tls.handshake.random" -T fields -e tls.handshake.random
# 随机数等于固定 HRR 常量时,说明这一帧是 HelloRetryRequest 而不是真正的 ServerHello字段逐项读法
| 字段 | 含义 | 判读要点 |
|---|---|---|
| version / supported_versions | 协议版本 | 1.3 以扩展为准,记录层字段固定为 0x0303 |
| random | 服务端随机数 | 等于 HRR 常量即为 HelloRetryRequest |
| session_id | 会话标识 | 1.2 用于会话恢复,1.3 兼容与 PSK 场景使用 |
| cipher_suite | 选中的密码套件 | 必须出现在客户端列表内,否则不应被选中 |
| compression_method | 压缩方法 | 现代实现恒为 0,非 0 说明实现异常 |
| extensions | 扩展集合 | key_share、ALPN、supported_versions 等都在这里 |
TLS 1.3 下 ServerHello 之后的消息全部加密,证书、Finished、应用层参数都看不到明文。要逐项核对必须导出会话密钥(SSLKEYLOGFILE)后交给 Wireshark 解密,或改用两端日志对照。
多主机共享同一入口时,同一个 IP 下不同 SNI 的 ServerHello 可能完全不同。分析前先按 SNI 或主机名分组,否则会把多个虚拟主机的配置混成一份结论。
速查流程
- 先看版本是否为期望值,不是就先查版本协商
- 再看选中套件是否在客户端列表内,不在说明中间设备有干预
- 接着看 ALPN 结果是否与应用预期一致,HTTP/2 与 HTTP/1.1 混用常见
- 出现两次 ServerHello 时标记 HelloRetryRequest,解释额外往返
- 最后与客户端侧抓包对照,确认两侧看到的协商结果一致