首页/安全/加密与证书速查/TLS 1.2 与 1.3 握手差异对照
TLS 与 HTTPS60 条

TLS 1.2 与 1.3 握手差异对照

两代协议在握手轮次、密钥交换、套件结构与加密范围上差异明显:TLS 1.3 更简洁且安全属性更强,但兼容性与抓包可见性不同。

加密与证书速查安全更新于 2026-10-13

两代协议的差异

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.2TLS 1.3
握手轮次2-RTT(恢复 1-RTT)1-RTT(0-RTT 可选,有重放风险)
密钥交换RSA / DHE / ECDHE仅 (EC)DHE / PSK
套件命名TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256TLS_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 拖慢握手。

易错点

  • 以为升级服务端就自动用上 1.3:客户端不支持时会静默回落到 1.2,必须验证实际协商结果
  • 把 1.2 的套件白名单当成对 1.3 的限制:1.3 的套件由协议默认集合控制,白名单无效
  • 只保留 1.3 而不做客户端普查:老客户端直接无法访问,属于可用性事故
  • 按 1.2 的抓包经验分析 1.3:把 KeyUpdate 当重协商、把加密的证书消息当异常,结论会完全跑偏
  • 忘记评估中间设备:握手挂起、随机失败多与老防火墙或七层设备相关,需并列排查
  • 只按配置文件判断现状:实际协商结果还受系统 OpenSSL 版本、发行版加密策略与客户端能力影响,必须以实测握手结果为准

数据来源与参考

  • RFC 8446(附录 A:与 TLS 1.2 的差异)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌