SSLInsecureRenegotiation用于允许不安全的TLS重协商(违反RFC 5746),仅在老旧客户端(如JDK 6u45前)必须重协商且无法升级时启用,需在VirtualHost内配置并承担CVE-2009-3555风险。

Apache 中的 SSLInsecureRenegotiation 不是为“支持旧版协议”而设,而是控制是否允许**不安全的 TLS 重协商行为**——即未遵循 RFC 5746 安全机制的旧式 renegotiation。它与 SSL/TLS 协议版本(如 TLS 1.0、1.1)无关,也不影响握手初始阶段的协议协商。启用它仅在极少数场景下绕过重协商校验,且会带来 CVE-2009-3555 的中间人攻击风险。
什么情况下才需要开启 SSLInsecureRenegotiation
只有当真实客户端明确触发重协商、又无法升级时,才考虑启用:
- 日志中持续出现
Re-negotiation requested but not allowed或客户端报SSL handshake failed - 确认客户端是 JDK 6u45 之前版本、老旧 Android WebView、特定嵌入式设备或定制固件
- 已排除 TLS 终止在前置负载均衡器(如 Cloudflare、ALB)的可能性——若 TLS 在 LB 终止,Apache 根本收不到重协商请求,此配置无效
如何正确启用该选项
必须在启用 HTTPS 的虚拟主机配置块内设置,不能写在全局或 .htaccess 中:
- 编辑站点配置文件(例如
/etc/apache2/sites-enabled/example.com.conf) - 在
<virtualhost></virtualhost>块中,确保已有SSLEngine on、SSLCertificateFile和SSLCertificateKeyFile,然后添加一行:
SSLInsecureRenegotiation on - 保存后重启服务:
sudo systemctl reload apache2(Debian/Ubuntu)或sudo apachectl graceful(RHEL/CentOS)
启用后必须注意的安全边界
这不是常规加固项,而是有明确代价的兼容性让步:
- 仅对实际发起重协商的连接生效(如需客户端证书认证的子路径),普通 HTTPS 浏览不受影响
- 现代浏览器(Chrome 30+、Firefox 25+)、OpenSSL 1.0.1+ 及 Java 6u45+ 完全不使用该机制,开了也无作用
- 不能与
SSLOptions +OptRenegotiate混用——后者是主动触发重协商,前者只是被动接受不安全请求,二者逻辑不同且共存易引发不可控行为
替代方案优先于开启该选项
绝大多数问题其实可通过更安全的方式解决:
- 升级客户端:JDK 6u45 发布于 2013 年,应推动迁移至受支持的 JRE 版本
- 调整客户端逻辑:避免在已建立连接上发起重协商,改为新建连接或使用其他认证方式
- 检查中间链路:确认没有代理或网关擅自插入重协商指令;某些老旧 WAF 或 DPI 设备会强制重协商











