nginx 无法直接拦截 tls 重协商,但可通过禁用客户端重协商、限流连接与请求、缩短会话超时及前置防护三方面防御 ssl 重协商攻击。

Nginx 本身不处理 TLS 握手的加密运算,所以不能直接拦截或终止重协商行为,但可以通过环境协同、配置收紧和前置限流三方面有效防御 SSL 重协商攻击(如 CVE-2011-1473)。
彻底禁用客户端发起的重协商
这是最根本的防护手段。攻击依赖客户端反复触发 renegotiation,关闭它就切断了攻击路径:
- 确保 OpenSSL 版本 ≥ 1.1.0(推荐 1.1.1w 或 3.0.13+),该版本默认禁用不安全重协商
- 检查
/etc/ssl/openssl.cnf,删除或注释掉Options = UnsafeLegacyRenegotiation行 - 若自行编译 OpenSSL,确认 configure 时未启用
--enable-unsafe-renegotiation - Nginx 配置中无需额外指令,但需确保未通过其他方式(如自定义 SSL_CTX 设置)重新开启
限制 TLS 握手频率与连接生命周期
即使重协商被禁,攻击仍可能通过大量新建连接耗尽资源:
- 在
http块中定义限流区域:limit_conn_zone $binary_remote_addr zone=ssl_conn:10m;limit_req_zone $binary_remote_addr zone=ssl_req:10m rate=3r/s; - 在
server { listen 443 ssl; }中应用:limit_conn ssl_conn 5;(每个 IP 最多 5 个并发 SSL 连接)limit_req zone=ssl_req burst=10 nodelay; - 缩短会话复用窗口:
ssl_session_timeout 2m;,避免缓存被滥用
强化超时控制,让无效连接快速失败
防止慢速握手和半开连接长期占位:
-
ssl_handshake_timeout 5s;(Nginx 1.19.0+ 支持,强制握手必须在 5 秒内完成) -
client_header_timeout 8s;(SSL 建立后,HTTP 请求头须在 8 秒内发完) -
keepalive_timeout 25s;(避免长连接堆积) -
reset_timedout_connection on;(超时直接发 RST,加快内核状态释放)
前置防护不可替代
真正有效的防线常在 Nginx 之前:
- 使用
nftables限制单 IP 新建 TLS 连接速率,例如:nft add rule ip filter input tcp dport 443 ct state new limit rate 5/minute burst 10 packets - 云上 WAF 或四层高防服务(如阿里云 Anti-DDoS Pro)可识别高频空 ClientHello、缺失 SNI、畸形扩展等异常握手模式,在流量抵达服务器前拦截
不复杂但容易忽略











