apache默认禁用不安全tls重协商以防范cve-2009-3555;仅当确认老旧客户端(如jdk 6u45前)无法升级且日志出现“re-negotiation requested but not allowed”时,才在virtualhost内启用sslinsecurerenegotiation on,并严格限制使用范围。

Apache 默认禁止不安全的 TLS 重协商,这是为防范 CVE-2009-3555 的关键防护。只有当明确确认旧客户端(如 JDK 6u45 之前、某些嵌入式设备或定制固件)无法升级,且连接持续失败报 “Re-negotiation requested but not allowed” 或 “SSL handshake failed” 时,才考虑启用 SSLInsecureRenegotiation。
确认是否真需要开启
不是所有 SSL 连接问题都源于重协商。先排查真实原因:
- 检查 Apache 错误日志,确认出现重协商拒绝提示,而非证书链、SNI 或协议不匹配等其他错误
- 确认客户端确实使用老协议栈:例如 Java 应用运行在 JDK 6u44 或更早;Android 4.0 以下 WebView;或特定工控设备 SDK
- 若前端有 TLS 终止设备(如 Cloudflare、AWS ALB、Nginx 反向代理),Apache 实际收不到原始重协商请求,此配置无效
在虚拟主机中正确启用
该指令必须写在启用 HTTPS 的 <virtualhost></virtualhost> 块内,不能放在全局上下文或 .htaccess 中:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- 编辑站点配置文件(如
/etc/apache2/sites-enabled/example.com.conf) - 确保已启用
SSLEngine on,并已配置证书路径(SSLCertificateFile和SSLCertificateKeyFile) - 在同一
<virtualhost></virtualhost>块内添加:SSLInsecureRenegotiation on - 保存后重启服务:
sudo systemctl reload apache2(Debian/Ubuntu)或sudo apachectl graceful(RHEL/CentOS)
启用后的安全与兼容注意事项
打开这个开关不是增强安全,而是接受已知风险以换取连通性:
- 仅影响主动触发重协商的场景:比如客户端证书二次认证、部分代理转发流程,普通 HTTPS 页面访问不受影响
- 现代浏览器(Chrome 30+、Firefox 25+)、OpenSSL 1.0.1+ 服务端、JDK 7u25+ 客户端完全不走该路径,开启后也无感知
- 一旦启用,Apache 将放弃对 CVE-2009-3555 的防护,中间人可利用重协商注入请求——务必限制该虚拟主机仅面向必要旧设备,避免暴露给公网通用入口
- 不建议搭配宽松协议(如
SSLProtocol all -SSLv2 -SSLv3)一起放宽,应保持 TLSv1.2+ 为主,仅让重协商机制“降级”,而非整个握手过程
替代方案优先考虑
比起开启不安全重协商,更推荐从客户端或架构侧解决:
- 升级 Java 应用:JDK 6u45 已支持 RFC 5746 安全重协商,升级即可消除依赖
- 在客户端代码中显式指定 TLS 版本和加密套件,避免回退到不安全协商路径
- 若为内部系统,可在前置反向代理(如 Nginx)完成 TLS 终止,并将 HTTP 流量转给 Apache,彻底绕过重协商问题
- 确认是否真需客户端证书认证;若非必需,移除相关配置可直接规避重协商触发点










