首页/网络/协议速查/ServerHello 与服务器消息

ServerHello 与服务器消息

服务器应答:选定版本与套件、给出 key_share;随后送证书链、CertificateVerify(证明私钥持有)与 Finished(校验握手)。

协议速查网络更新于 2026-10-13

服务器侧握手的消息序列

ServerHello 是服务器对 ClientHello 的应答:选定协议版本与套件,给出自己的随机数与密钥交换参数。之后服务器发送证书链,再用证书私钥对握手摘要签名(CertificateVerify,用于证明自己确实持有私钥),最后用 Finished 校验整个握手过程未被篡改。TLS 1.3 里这些消息除 ServerHello 外全部加密传输。

基本信息

方向服务器到客户端
1.3 序列ServerHello、EncryptedExtensions、Certificate、CertificateVerify、Finished
1.2 序列ServerHello、Certificate、ServerKeyExchange、ServerHelloDone,随后客户端回应并各自发送 Finished
明文范围1.3 中只有 ServerHello 明文,其余加密
规范RFC 8446 §4.1.3 与 §4.4,1.2 对应 RFC 5246

消息与作用

消息作用异常表现
ServerHello选定版本与套件,给出 key_share无共同套件时直接失败
EncryptedExtensions1.3 中承载其余协商参数缺少扩展可能导致后续行为不符预期
Certificate服务器证书链链不完整时客户端报 unknown_ca
CertificateVerify用证书私钥签名握手摘要失败说明私钥与证书不匹配
FinishedHMAC 校验握手完整性不匹配说明握手被中间人篡改

观察协商结果

观察协商结果
openssl s_client -connect example.com:443 </dev/null 2>/dev/null \
  | grep -E 'Protocol|Cipher|Server Temp Key'     # 版本、套件与临时密钥曲线
# 校验链完整性(严格模式)
openssl s_client -connect example.com:443 -verify 5 -verify_return_error </dev/null | head -5
# 只跑 1.3 观察握手是否成功
openssl s_client -tls1_3 -connect example.com:443 </dev/null >/dev/null && echo ok

典型使用场景

  • 排查握手失败:确认双方是否有共同协议版本、套件与曲线
  • 验证证书链完整性:命令行显示连接成功但浏览器报错,多半缺中间证书
  • 确认服务端是否真的用了 1.3 与预期的临时密钥曲线
  • 审计私钥与证书是否匹配(CertificateVerify 阶段失败时)
服务器证书链不完整(缺中间证书)时,浏览器报 unknown_ca,但 openssl s_client 往往仍显示连接成功;必须用 -verify 与 -verify_return_error 的严格模式才能复现真实客户端行为。
1.3 中 ServerHello 之后的消息都加密:抓包工具只能看到握手长度与外层结构,要定位证书与扩展问题得依赖 s_client 输出或客户端侧日志。

易错点

  • 用 s_client 显示连接成功就判定证书没问题:缺中间证书时它可能仍显示成功,必须用严格校验模式
  • 私钥与证书不匹配:CertificateVerify 阶段失败,日志常只写握手错误,需单独用模数或公钥指纹比对确认
  • ServerHello 里没有可用的 key_share 却不做 HelloRetryRequest:客户端与服务的曲线列表无交集时握手失败,应放宽曲线配置并复核
  • 忽略中间设备对握手的干预:某些代理会重写 ServerHello 相关字段,表现为「同一证书在别处正常、经过该代理就失败」

数据来源与参考

  • RFC 8446 §4.1.3
  • RFC 5246 §7.4

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌