防范TLS重协商攻击的核心是彻底禁用客户端发起重协商、收紧TLS握手与连接超时、限制单IP并发连接及请求速率、精简TLS协商开销;需升级OpenSSL≥1.1.0、配置ssl_handshake_timeout 5s、limit_conn perip_conn 15、禁用TLS 1.0/1.1及RSA密钥交换。

防范 TLS 重协商攻击,核心是切断攻击者滥用 客户端发起重协商(Client-initiated Renegotiation) 的路径,同时防止其耗尽 Nginx worker 进程的 CPU 和连接资源。Nginx 本身不参与 TLS 握手计算,但可通过 OpenSSL 层禁用、连接限流与超时收紧三方面协同防御。
彻底禁用客户端重协商(最根本手段)
该机制在现代 TLS 实践中已无必要,且是 CVE-2011-1473 的直接载体。禁用后,攻击者无法触发任何重协商请求:
- 确保 OpenSSL 版本 ≥ 1.1.0(推荐 1.1.1w 或 3.0.13+),这些版本默认关闭不安全重协商
- 检查 /etc/ssl/openssl.cnf,确认 Options = UnsafeLegacyRenegotiation 行已被注释或删除
- 若使用自编译 OpenSSL,编译时不得添加 --enable-unsafe-renegotiation
- Nginx 配置中无需额外指令,但需避免通过第三方模块或自定义 SSL_CTX 重新启用该功能
收紧 TLS 握手与连接生命周期
即使重协商被禁,攻击者仍可能用半开握手或慢速请求占满 worker 连接槽位。必须强制快速失败:
- ssl_handshake_timeout 5s:仅 Nginx 1.19.0+ 支持,限制 TLS 握手必须在 5 秒内完成,超时即断连
- client_header_timeout 8s:HTTPS 连接建立后,客户端须在 8 秒内发完全部请求头
- keepalive_timeout 25s:避免长连接长期空闲堆积,25 秒兼顾复用与资源释放
- reset_timedout_connection on:对超时连接发送 RST 包,更快回收内核状态,减少 TIME_WAIT
限制单 IP 并发连接与请求速率
每个重协商请求都会占用一个 worker 连接槽位并触发非对称运算。需在入口层硬性控量:
- 在 http 块中定义:limit_conn_zone $binary_remote_addr zone=perip_conn:10m
- 在 server 块(尤其是 listen 443 ssl)中启用:limit_conn perip_conn 15(建议值 10–20)
- 配合请求限速:limit_req_zone $binary_remote_addr zone=req_rate:10m rate=30r/m
- 在关键路径如 /login 或 /api 中启用:limit_req zone=req_rate burst=10 nodelay,超限立即返回 503
精简 TLS 协商开销,规避高成本操作
某些协议与密钥交换方式会显著放大单次握手的 CPU 消耗,应主动剔除:
- ssl_protocols TLSv1.2 TLSv1.3:明确禁用 TLS 1.0/1.1
- ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:优先 ECDSA/ECDHE,禁用 RSA 密钥交换
- ssl_session_cache shared:SSL:5m 与 ssl_session_timeout 90s:控制会话缓存大小与存活时间,防缓存被恶意占满
- ssl_stapling on; ssl_stapling_verify on:启用 OCSP Stapling,避免每次握手都远程校验证书状态


















