TLS基础回顾:握手协议、加密算法与证书体系

做TLS版本升级,最怕什么?

怕对基础理解不透,日志都看不懂。

我之前带团队排查过一起"诡异断连"问题——客户端和服务端握手要8秒,查了半天才发现是证书链没传完整。从那以后,我每次讲TLS都必须先拉一遍这三块:握手怎么握、密码怎么算、证书怎么验。

2.1 握手协议——安全通道的"敲门砖"

握手,说白了就是双方先对暗号。暗号对上了,才开启加密通信。

我习惯把握手分成两个阶段:

  • 第一阶段(明文交换):ClientHello + ServerHello + 证书。这时候还没加密,但决定了后面用什么算法。
  • 第二阶段(密钥协商):用非对称加密交换一个"预主密钥",然后双方各自推导出会话密钥。

你想想看,如果中间人能在第一阶段篡改"支持的算法列表",强制降级到RC4这种弱密码——嗯,这就是经典的降级攻击。TLS 1.3直接砍掉了很多历史包袱,握手从2-RTT降到1-RTT。

TLS 1.2 vs TLS 1.3 握手对比

对比项 TLS 1.2 TLS 1.3
往返次数 2-RTT(完整握手) 1-RTT
密钥交换算法 RSA / DHE / ECDHE 仅 (EC)DHE
协商阶段 先定密码套件,再密钥交换 密钥交换与算法协商合并
0-RTT 恢复 不支持(Session Ticket 非标准) 原生支持 PSK + 0-RTT

实际升级的时候,我最烦的就是 1.3 的 0-RTT——它把首次连接的请求也加密了,如果审计日志要记录请求首行,你得用导出的 key log 才能解密。我曾经因为没提前安排 key log 的保存策略,导致出问题后整整查了两天日志才定位到根因。

2.2 加密算法——三条腿的凳子

TLS能安全,靠的是三类算法协同工作:

  1. 非对称加密(如RSA、ECDHE)——用来交换密钥。速度慢,但安全。
  2. 对称加密(如AES-128-GCM)——用来真正加密数据。速度快,但要先约好密钥。
  3. 哈希算法(如SHA-256、SHA-384)——用来做完整性校验和消息认证码。

我打个比方:非对称是保险柜钥匙的快递盒,对称是保险柜本身,哈希是封箱胶带上的防伪标记。任何一个缺了,通道都不牢靠。

我在项目里常用 AES-256-GCM 搭配 ECDHE 做密钥交换。前者硬件加速支持好,后者提供前向安全性——即使私钥泄露,历史会话也无法被解密。这一点在审计合规里特别重要,PCI DSS 4.0 就明确要求使用前向安全的密码套件。

2.3 证书体系——谁来证明你是你

握手时,服务端会发来一张证书。客户端怎么知道这张证书是真的?

靠的是一棵"信任树"——PKI 体系,根 CA 自己签自己(自签名),中间 CA 由根签,终端证书由中间 CA 签。客户端本地预装了根证书,一路验证签名链,如果链上某环证书过期、被吊销、域名不匹配——握手直接失败。

我之前遇到过一件事:某银行内部系统升级 TLS 1.3 后,旧应用突然连不上。查了半天,发现是旧应用没有打包中间CA证书,只发了终端证书。TLS 1.2 下很多客户端会自动补全,但 1.3 的验证更严格,直接拒了。嗯,那以后我养成了个习惯——上线前一定用 OpenSSL 手动验证证书链完整性。

避坑指南:升级 TLS 版本时,别忘了同步检查证书吊销机制(CRL/OCSP)。很多环境之前用 CRL 分发,升级后 OCSP stapling 不工作了,因为负载均衡器配置没更新。我曾经吃过一次亏,线上出现大量 OCSP 请求超时,导致握手延迟飙到10秒以上。

TLS核心知识结构 握手协议 (Handshake) TLS 1.2: 2-RTT / TLS 1.3: 1-RTT 密钥交换 → 密码套件协商 加密算法 (Crypto) 非对称: ECDHE / RSA 对称: AES-256-GCM 哈希: SHA-256 / SHA-384 证书体系 (PKI) 根CA → 中间CA → 终端证书 X.509 v3 / 证书链验证 CRL / OCSP 吊销检查 三者协同: 握手定密码 → 非对称换密钥 → 对称加密数据 → 证书证明身份

2.4 小结一下这个基础

升级TLS版本,说穿了就是换一套更硬的"握手+加密+证书"组合。

  • 握手协议决定了交互效率和可协商的算法集——1.3砍掉了不安全选项。
  • 加密算法决定了通信的保密性和完整性——别再用旧算法了。
  • 证书体系决定了信任链——注意中间CA缺失、吊销失效。

这些基础搞扎实了,后面看审计日志才不至于一头雾水。你想想看,当日志里出现"unknown_ca"或者"handshake_failure"时,如果连证书链结构都不清楚,那排查根本无从下手。我个人是强烈建议团队在升级前先做一次 OpenSSL 全链路握手测试,每条日志都看一遍,确认三步都走通。