Apache 通过正确配置 mod_ssl 禁用不安全的客户端重协商来缓解 SSL 重协商攻击;mod_ssl 自 2.2.15 起默认禁用该行为,并提供配置项控制。

Apache 本身不直接“利用 mod_ssl 防御 SSL 重协商(renegotiation)攻击”,而是通过 正确配置 mod_ssl 模块,禁用不安全的客户端发起的重协商行为,从而缓解该类攻击。SSL/TLS 重协商漏洞(如 CVE-2009-3555)允许攻击者在已建立的加密连接中注入恶意请求,mod_ssl 自 2.2.15 起默认禁用不安全的重协商,并提供明确配置项控制行为。
确认 mod_ssl 版本与启用状态
旧版本(
- 运行
httpd -v或apache2 -v查看 Apache 版本,确保 ≥ 2.2.15(推荐使用 2.4.x 稳定版) - 检查 mod_ssl 是否已加载:
httpd -M | grep ssl(或a2enmod ssl启用) - 若使用自定义编译,确认 configure 时包含
--enable-ssl
关键配置:禁用不安全重协商
在 Apache 配置文件(如 ssl.conf 或虚拟主机段)中设置:
-
SSLStrictSNIVHostCheck on—— 强化 SNI 校验(辅助防御) -
SSLInsecureRenegotiation off—— 核心防护项,拒绝客户端发起的不安全重协商(默认值在 2.2.15+ 即为 off) - (可选)
SSLProtocol all -SSLv2 -SSLv3—— 禁用已淘汰协议,减少攻击面
修改后务必重启服务:systemctl restart apache2(Debian/Ubuntu)或 systemctl restart httpd(RHEL/CentOS)。
立即学习“Java免费学习笔记(深入)”;
验证防护是否生效
仅靠配置不能替代测试,需主动验证:
- 使用
openssl s_client -connect example.com:443 -reconnect观察是否返回RENEGOTIATING并成功完成 —— 若被拒绝,通常显示SSL alert number 100或连接中断 - 借助专业工具如 testssl.sh 执行
./testssl.sh --reneg example.com,确认结果为Secure renegotiation IS supported(即仅支持安全重协商) - 避免依赖浏览器行为判断,因现代浏览器大多已主动限制重协商
补充建议:纵深防御不可少
重协商只是 TLS 层一环,需结合其他措施提升整体安全性:
- 启用 HSTS(
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains")防止协议降级 - 配置强密码套件,优先选用 ECDHE + AES-GCM 类前向保密组合
- 定期更新 OpenSSL 库(Apache 依赖其底层实现),避免底层 TLS 实现漏洞
- 如业务无需重协商(绝大多数 Web 场景不需要),可进一步在应用层关闭相关逻辑(如 Java 中禁用
SSLEngine.setNeedClientAuth(true)的动态触发)

















