服务器侧握手的消息序列
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 | 无共同套件时直接失败 |
| EncryptedExtensions | 1.3 中承载其余协商参数 | 缺少扩展可能导致后续行为不符预期 |
| Certificate | 服务器证书链 | 链不完整时客户端报 unknown_ca |
| CertificateVerify | 用证书私钥签名握手摘要 | 失败说明私钥与证书不匹配 |
| Finished | HMAC 校验握手完整性 | 不匹配说明握手被中间人篡改 |
观察协商结果
观察协商结果
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 输出或客户端侧日志。