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

一、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.2 | TLS 1.3 |
|---|---|---|
| 握手往返 | 2 RTT | 1 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_ERROR | TLS 版本不兼容 | 启用 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 — 减少重复连接开销