两代协议的差异
TLS 1.2 与 TLS 1.3 的差异不只在版本号:握手往返次数、密钥交换方式、套件结构、握手消息的加密范围都变了。TLS 1.3 把协商压缩到一次往返,强制前向保密,只保留 AEAD 套件,并把证书消息放进加密信道;代价是抓包可见性下降、部分老中间设备不兼容。
基本信息
| 标准 | TLS 1.2:RFC 5246;TLS 1.3:RFC 8446 |
|---|---|
| 握手轮次 | 1.2 为 2-RTT(恢复 1-RTT);1.3 为 1-RTT(可选 0-RTT) |
| 密钥交换 | 1.2 支持 RSA/DHE/ECDHE;1.3 仅 (EC)DHE 或 PSK |
| 套件结构 | 1.2 含密钥交换与认证;1.3 仅算法、模式与哈希 |
| 前向保密 | 1.2 取决于套件;1.3 默认具备 |
| 配置入口 | 1.2 用 ssl_ciphers;1.3 用独立的套件配置项 |
| 典型差异现象 | 1.3 抓包看不到证书明文,排障需换工具 |
逐项对照
| 维度 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 握手轮次 | 2-RTT(恢复 1-RTT) | 1-RTT(0-RTT 可选,有重放风险) |
| 密钥交换 | RSA / DHE / ECDHE | 仅 (EC)DHE / PSK |
| 套件命名 | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | TLS_AES_128_GCM_SHA256 |
| 握手加密 | 证书与密钥交换基本明文 | ServerHello 之后基本加密 |
| 前向保密 | 看是否选到 ECDHE 套件 | 协议强制具备 |
| 可移除算法 | 可协商 CBC、静态 RSA、RC4、3DES | 上述全部移除 |
| 服务端偏好 | ssl_prefer_server_ciphers 影响明显 | 套件由协议默认集合与 ssl_conf_command 决定 |
同一站点分别按版本测试
同一站点分别按版本测试
# 分别限定版本,对比协商到的协议与套件
for v in tls1_2 tls1_3; do echo "== $v =="; openssl s_client -connect example.com:443 -servername example.com -$v </dev/null 2>/dev/null | grep -E 'Protocol|Cipher'; done
# 观察 1.3 中 ClientHello 之后是否已加密
openssl s_client -connect example.com:443 -tls1_3 -msg </dev/null 2>&1 | head -30
# 确认服务端是否仍接受旧版本(预期握手失败)
openssl s_client -connect example.com:443 -tls1_1 </dev/null 2>&1 | grep -E 'alert|error|Protocol'迁移实施要点
- 先并存再收紧:同时开启 1.2 与 1.3,按客户端分布决定是否最终关闭 1.2
- 配置要分别写:1.3 的套件不受 ssl_ciphers 影响,需用对应版本的独立配置项
- 证书与密钥交换分离理解:1.3 中 RSA 证书仍可用,但不能再做 RSA 密钥传输
- 回归测试覆盖老客户端:早期 Java 运行时、老款安卓 WebView 与部分 IoT 库
- 排障工具要更新:抓包看不到证书后,改用 s_client、服务端日志或临时密钥日志
- 中间设备要评估:老防火墙与七层代理可能拦截 1.3 握手,表现为连接挂起
迁移之后排查思路从「看包」转向「看协商结果」:客户端侧用 s_client 观察 Protocol、Cipher 与证书链,服务端侧看错误日志里的告警类型。1.3 的失败告警比 1.2 更粗,常只报 handshake failure,定位顺序应先确认版本与套件交集,再查证书与中间设备。
把 TLS 1.2 的套件字符串照搬给 1.3 属于无效配置:1.3 使用独立命名体系与配置项,写错不会报错,但实际协商结果与预期完全不同,最终只能靠 s_client 验证。
常见误区
- 以为 1.3 继承了 1.2 的套件白名单:两者配置体系独立,需要分别维护
- 以为启用 1.3 后证书就不再重要:1.3 仍要求证书认证,只是不再用 RSA 做密钥传输
- 把 0-RTT 当作零延迟优化直接全站开启:非幂等接口存在重放风险
- 认为 1.3 完全取代 1.2:客户端支持度差异决定了这段并存期必须存在
- 看到握手消息变少就以为抓包信息更全:恰恰相反,1.3 加密范围更大
- 用 1.2 的会话恢复思路理解 1.3:会话票据与 PSK 的语义已不同
两代协议并存期间,验收标准要写清方向:客户端侧用 s_client 分别固定 1.2 与 1.3 测试,确认各版本协商到的套件都不含 CBC 与静态 RSA,并且 1.3 的密钥交换组在两端都能命中,避免出现大量 HelloRetryRequest 拖慢握手。