×

SSL/TLS 握手全过程详解:从密钥协商到证书链验证

你每天访问的每一个 https:// 网站,背后都要经历一次 SSL/TLS 握手。这个过程在几百毫秒内完成,却涉及非对称加密、证书链验证、密码套件协商等多个复杂步骤。理解它,能帮你排查证书错误、优化 HTTPS 性能、甚至识别中间人攻击。

TLS 握手与证书链校验示意图
示意图: TLS 握手与证书链校验示意图

一、TLS 1.2 与 TLS 1.3 握手流程对比

TLS 1.3 相比 TLS 1.2 有两大改进:更快(减少一轮往返)和更安全(移除了不安全的密码套件)。

TLS 1.2 握手(2-RTT)

ClientHello
ServerHello + 证书
密钥交换
Finished
加密通信

TLS 1.3 握手(1-RTT)

ClientHello + KeyShare
ServerHello + 证书 + Finished
加密通信
对比项TLS 1.2TLS 1.3
握手往返2 RTT1 RTT / 0 RTT(恢复)
密钥交换RSA 或 DHE/ECDHE仅 ECDHE / X25519
证书加密明文传输加密传输
加密算法包含 CBC、RC4仅 AEAD(AES-GCM、ChaCha20)
前向保密可选强制
💡 提示:TLS 1.3 的 0-RTT 恢复模式虽然更快,但存在重放攻击风险。对于敏感操作(如支付),服务端应禁用 0-RTT 或限制 0-RTT 只用于幂等请求。

二、证书链:信任是怎么建立的

服务器证书
中间 CA 证书
根 CA 证书 (预装)

浏览器和操作系统预装了约 100–150 个根 CA 证书。服务器在握手时发送自己的证书和中间 CA 证书。浏览器逐级验证签名,只要链的顶端是预装的根 CA,就认为可信。

⚠️ 注意:常见错误:服务器只发送自己的证书,不发送中间 CA 证书。这导致部分浏览器和大部分 API 客户端报错“证书链不完整”。解决方法:在 Nginx/Apache 配置中把中间证书和服务器证书合并为一个 fullchain.pem 文件。

三、证书类型对比

类型验证速度浏览器显示场景成本
DV域名控制权分钟级锁图标个人站免费 (Let's Encrypt)
OV企业身份1–3 天锁图标企业官网$50–$200
EV严格实体验证1–4 周锁图标 + 企业名金融、电商$100–$500

四、常见 SSL 错误排查

错误原因修复
ERR_CERT_DATE_INVALID证书过期续签;检查 certbot 定时任务
ERR_CERT_COMMON_NAME_INVALID域名不匹配确认 SAN 包含当前域名
ERR_CERT_AUTHORITY_INVALID证书链不完整加入中间 CA 证书
ERR_SSL_PROTOCOL_ERRORTLS 版本不兼容启用 TLS 1.2+

五、实用排查命令

# 查看完整证书链
openssl s_client -connect example.com:443 -showcerts

# 检查证书有效期
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates

# 检查支持的 TLS 版本
nmap --script ssl-enum-ciphers -p 443 example.com

# 检测证书链是否完整
curl -vI https://example.com 2>&1 | grep -i "SSL\|issuer\|subject"

✅ TLS 性能优化清单:

  • 启用 TLS 1.3 — 减少一轮往返
  • 启用 OCSP Stapling — 避免浏览器单独查询吁销状态
  • 启用 HTTP/2 — 多路复用减少连接数
  • 使用 ECDSA 证书 — 签名更小更快
  • 配置 TLS Session Tickets — 减少重复连接开销