首页/安全/加密与证书速查/TLS 重协商与安全缓解
TLS 与 HTTPS60 条

TLS 重协商与安全缓解

TLS 1.2 允许握手完成后重新协商参数(含客户端发起);历史上出现过前缀注入类问题,现代实现默认启用 RFC 5746 安全重协商,TLS 1.3 则彻底取消了重协商。

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

TLS 重协商与缓解

TLS 1.2 允许在握手完成后重新协商参数(包括由客户端发起),历史上出现过前缀注入类问题,现代实现默认启用 RFC 5746 定义的安全重协商扩展加以缓解。TLS 1.3 则彻底取消了重协商,改用 KeyUpdate 更新密钥、用握手后认证处理需要再认证的场景。因此「我的服务是否还有重协商」这个问题,答案取决于协议版本与底层实现的安全默认值。

基本信息

TLS 1.2支持重协商;OpenSSL 1.0.1 及以上默认启用 RFC 5746 安全重协商标记
TLS 1.3无重协商概念,改用 KeyUpdate 与握手后认证
主要风险客户端发起的重协商带来 CPU 放大与历史注入类问题
缓解方向升级底层库与服务端软件,协议收敛到 1.2 以上
兼容顾虑少数老旧设备依赖在已建立连接上再做客户端认证

典型使用场景

  • 评估协议基线时确认是否还残留客户端可发起的重协商
  • 排查 CPU 异常升高:可能与重协商风暴或被利用有关
  • 升级 nginx 与 OpenSSL 后验证重协商行为的变化
  • 老设备兼容评估:确认哪些流程依赖重协商
  • 安全测评中回答「是否支持不安全重协商」这类问题

确认库版本与协议基线

确认库版本与协议基线
openssl version                                    # 确认底层库版本
nginx -V 2>&1 | grep -o 'OpenSSL [0-9.]*[a-z]*'     # nginx 实际链接的库
# 服务端协议基线建议(nginx):
#   ssl_protocols TLSv1.2 TLSv1.3;
# 抓包观察是否有新的 ClientHello 出现在同一连接上:
#   tshark -i eth0 -Y 'tls.handshake.type == 1' -c 20

版本差异对照

版本重协商支持替代机制
TLS 1.2支持,需 RFC 5746 缓解无,仍依赖重协商
TLS 1.3不支持KeyUpdate 与握手后认证
现实残留少量老设备依赖单独入口或升级客户端
排查重点CPU 与连接行为异常结合抓包判断
少数老旧设备依赖重协商,例如在已建立连接上再做客户端证书认证的应用。升级到 TLS 1.3 前要先验证这些流程,它们往往是升级受阻的真实原因,而不是证书或套件问题。

易错点

  • 认为禁用 TLS 1.0 与 1.1 就自动禁用了重协商 → 1.2 仍支持,取决于实现的安全默认
  • 忽略依赖重协商的旧客户端 → 升级后出现偶发握手失败,而且难以复现
  • 长期不更新底层库 → 老旧实现缺少安全重协商支持,风险面持续存在
  • 把重协商当作性能优化手段 → 客户端可发起时反而成为 CPU 放大攻击的入口

数据来源与参考

  • RFC 5746(重协商指示扩展)
  • RFC 8446 §1.2(与 1.2 的差异)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌