TLS 握手看什么
TLS 握手阶段的抓包能回答三个问题:客户端有没有把正确的域名送出去(Client Hello 的 SNI 扩展)、双方谈成了什么版本与加密套件(Server Hello 与扩展)、失败时对方或中间设备给了什么告警。TLS 1.2 及之前证书以明文传输,可以直接读签发者与有效期;TLS 1.3 起 Server Hello 之后的所有握手内容全部加密,抓包只能看到 Client Hello 与 SNI。握手失败有两种形态:收到 Alert 说明对端明确拒绝,没收到 Alert 而连接直接断,通常是中间设备截断或策略丢包。
基本信息
| 适用工具 | Wireshark 4.x / tshark,需能解密时才看得到证书 |
|---|---|
| 关键字段 | tls.handshake.type、tls.handshake.extensions_server_name、tls.alert_message |
| 握手类型号 | 1 客户端问候、2 服务端问候、11 证书(1.2)、16 客户端密钥交换 |
| 版本差异 | TLS 1.3 用 supported_versions 扩展表达版本,不再直接写在记录头 |
典型使用场景
- 客户端报证书错误:先确认 Client Hello 的 SNI 是否写对了域名,再看证书链是否完整
- 握手失败却看不到 Alert:怀疑中间设备截断,改用两端对照抓包夹逼
- 套件协商失败:把客户端提供的套件列表与服务端策略逐项比对
- 确认实际使用的版本:读 Server Hello 的版本与 supported_versions 扩展
- 回源证书不匹配:CDN 回源时 SNI 与 Host 头不一致导致的证书错误
TLS 过滤速查
TLS 过滤速查
tls.handshake.type == 1 # Client Hello,客户端问候
tls.handshake.extensions_server_name contains "example.com" # 按 SNI 筛
tls.handshake.type == 2 # Server Hello,服务端问候
tls.alert_message # 所有告警报文
tls.handshake.type == 11 # Certificate,TLS 1.2 可见
_tls.record.version == 0x0303 && tls.handshake.type == 1 # 记录层显示 1.2,以扩展为准常见 Alert 判读
| Alert | 含义 | 下一步 |
|---|---|---|
| handshake_failure | 无共同套件或服务端策略拒绝 | 比对双方套件与协议版本 |
| unknown_ca | 证书链不受信 | 检查根证书与中间证书是否补齐 |
| protocol_version | 版本不兼容 | 核对双方允许的最低版本 |
| bad_certificate | 证书损坏或校验失败 | openssl s_client 复核证书链 |
| access_denied | 客户端证书或策略拒绝 | 检查 mTLS 配置与 ACL |
| unrecognized_name | SNI 不被服务端接受 | 确认虚拟主机与 SNI 对应关系 |
TLS 1.3 抓包里找不到证书不是解析器坏了,而是协议本身把证书加密封装了;此时改用 openssl s_client -connect host:443 -servername host 观察握手与证书。
用密钥日志解密 TLS 流量属于敏感操作:密钥文件一旦落盘即可还原全部会话内容,只在受控排障环境启用并及时清理。