应用层报文判读71 条

TLS 1.3 握手表征

1.3 把密钥交换并入 Hello 扩展:单往返完成,证书消息已加密;抓包中 ServerHello 后直接加密应用数据,看不到明文证书细节但可见时序。

新版握手长什么样

较新的协议版本把密钥交换并入 Hello 扩展,握手压到一个往返完成,并且从服务端首个响应之后的内容就进入加密,证书等握手消息也不再明文。抓包上的形态差别很明显:旧版本在服务端 Hello 之后能看到明文的证书与密钥交换消息,新版本则很快转入加密的应用数据,只留下时序与长度可读。识别这一点,才知道为什么有些字段突然就看不到了。

基本信息

适用平台Wireshark / tshark,新旧版本对比尤其直观
识别依据服务端首个响应之后是否立刻进入加密握手数据
已知标记兼容用途的变更密码规格消息为伪包,不改变加密状态
解密前提加密的握手内容需要密钥日志才能查看

典型使用场景

  • 解释「为什么抓包里看不到证书内容」
  • 确认服务端实际启用了哪个协议版本
  • 排查版本降级或协商失败导致的兼容问题
  • 对比改造前后握手的往返次数
  • 定位重试请求造成的「多一轮」现象
  • 为客户端兼容性测试提供报文依据

形态对照

形态对照
# 旧版本: 服务端 Hello → 明文证书 → 密钥交换 → 变更密码规格
# 新版本: 服务端 Hello → 兼容用伪包 → 之后为加密的握手内容
tls.handshake.type == 2                   # 服务端 Hello
tls.record.content_type == 23             # 应用数据记录
# 加密的握手内容需密钥日志才能解读
# 出现第二组 Hello 时说明发生了重试,时间线会多一个往返

形态逐项读法

观察项含义异常信号
服务端响应后立即加密新版本握手特征属正常,不要当作解析失败
明文证书消息旧版本握手特征与配置启用的版本对照
兼容用伪包为中间设备保留的痕迹不改变加密状态,忽略即可
出现第二组 Hello协商重试多一个往返属正常,非故障
协商重试会让握手看起来多了一轮,这是协议允许的行为,不应作为性能退化或故障的证据。
为兼容保留的那条变更密码规格消息是伪包,不改变实际加密状态,排查时按噪声处理。

易错点

  • 看不到证书就认为抓包失败:新版本中证书已加密,属正常现象,需要密钥日志或换观测手段
  • 把协商重试当故障:多出的一个往返是协议允许的行为
  • 用旧版本的字段清单套新版本:字段可见性差异很大,分析思路必须跟着版本调整
  • 忽略兼容用伪包:误以为加密状态被改变,会得出错误的时序结论

数据来源与参考

  • RFC 8446(握手概览)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌