首页/安全/加密与证书速查/读懂 ClientHello 消息
TLS 与 HTTPS60 条

读懂 ClientHello 消息

ClientHello 是客户端发起握手的首条消息,包含版本、随机数、会话 ID、套件列表与扩展(SNI、ALPN、supported_groups、key_share 等),是定位握手失败的主要现场。

加密与证书速查安全更新于 2026-10-13

读懂客户端问候消息

客户端问候消息是握手的第一条消息,包含版本、随机数、会话标识、套件列表与一系列扩展(服务名称、应用层协议协商、支持的组、密钥份额等),是定位握手失败的主要现场。它的版本字段是兼容性固定值,真实支持的版本放在扩展里;该消息以明文传输,因此可以直接观察到服务名称与套件列表。

基本信息

版本字段为兼容性固定值,真实版本在扩展中
关键扩展服务名称、应用层协议协商、密钥份额、签名算法
随机数固定长度的随机值,参与密钥派生
可见性明文传输,可直接读取服务名称与套件列表

典型使用场景

  • 握手失败排错:确认客户端发来了哪些扩展
  • 兼容性验证:确认客户端真实支持的版本
  • 抓包分析:定位应用层协议协商结果
  • 安全排查:确认服务名称是否符合预期
  • 自研客户端调试:核对消息字段是否符合规范

打印握手消息查看

打印握手消息查看
openssl s_client -connect example.com:443 -servername example.com -msg </dev/null 2>&1 | head -40
# 抓包方式(需有采集环境)
tshark -i eth0 -Y 'tls.handshake.type == 1' -V

关键字段

字段作用排错价值
版本字段兼容性固定值不能据此判断真实版本
服务名称扩展指示目标站点缺失时会命中默认站点
支持版本扩展真实支持的版本判断能否协商新版本
密钥份额扩展携带密钥交换材料过大可能触发分片
新版本的兼容写法让记录层版本看起来仍是旧版本,判断客户端真实能力要看支持版本扩展而不是记录版本号。

落地建议

  • 排障时同时保存握手消息与协商结果
  • 抓包分析关注扩展内容而不是记录版本号
  • 客户端模拟测试覆盖缺少扩展的场景
  • 把握手失败的关键字段整理成排查手册
认为握手消息总是明文是常见误解:新版本协议从服务端响应开始即加密,只有客户端问候这一段可以直接观察。

易错点

  • 只按记录层版本判定客户端不支持新版本,该值只是兼容写法
  • 以为握手消息都会一直明文:新版本协议从服务端响应起即加密
  • 忽略服务名称扩展缺失的问题,导致命中默认站点
  • 只看套件列表不核对支持组与签名算法,排错不完整
  • 抓包时未设置合适过滤条件,得到的信息量不足
  • 自研客户端漏发关键扩展,服务端协商失败且报错含糊

数据来源与参考

  • RFC 8446 §4.1.2(ClientHello)
  • RFC 6066(SNI 扩展)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌