Apache 的 SSLProtocol 指令需显式启用 TLSv1.2 和 TLSv1.3(如 SSLProtocol +TLSv1.2 +TLSv1.3),禁用 SSLv2/3、TLSv1.0/1.1 等不安全版本,配合 TLS 1.3 专用密钥套件及 OpenSSL ≥1.1.1 才能安全启用 TLS 1.3。

Apache 中的 SSLProtocol 指令本身不提供“无感升级”能力,它只是控制服务器允许协商哪些 TLS/SSL 协议版本。所谓“无感升级”,实际依赖的是协议兼容性设计和渐进式配置策略——让新旧客户端都能正常连接,同时逐步淘汰老旧、不安全的协议,用户无需手动调整浏览器或客户端设置。
明确启用所需协议,禁用已知风险版本
避免使用 all -SSLv3 -TLSv1 -TLSv1.1 这类模糊写法,它容易误禁 TLS 1.2(当前仍广泛依赖)。应显式声明支持的协议:
- +TLSv1.2 +TLSv1.3:明确启用两个现代、安全的主版本,既保障 Java 11+、Chrome/Firefox/Edge 等主流客户端兼容,又引入 TLS 1.3 的性能与安全性优势
- 不写
-TLSv1.2或-TLSv1.3:防止意外关闭某版本,尤其 TLS 1.2 仍是 Java 8u261 以下、Android 7.0 之前等场景的唯一选择 - 彻底移除 SSLv2/SSLv3/TLSv1.0/TLSv1.1:这些协议存在已知高危漏洞(如 POODLE、BEAST),且被主流浏览器默认禁用
配合 TLS 1.3 专用密钥套件,避免协商失败
TLS 1.3 协商失败的最常见原因,是 SSLCipherSuite 中混入了 TLS 1.2 套件(如 ECDHE-...)。必须只用 TLS 1.3 原生命名套件:
- TLS_AES_128_GCM_SHA256:基础安全强度,兼容性最广
- TLS_AES_256_GCM_SHA384:更高加密强度,适合敏感业务
- TLS_CHACHA20_POLY1305_SHA256:在弱硬件或移动设备上性能更优
- 三者用英文冒号连接,中间不加空格;不能与
ECDHE-RSA-AES256-GCM-SHA384等 TLS 1.2 套件共存
确保 OpenSSL 底层支持,而非仅看 Apache 版本
mod_ssl 只是桥梁,TLS 1.3 是否可用,取决于 Apache 链接的 OpenSSL 版本:
- 运行
openssl version -a查看系统 OpenSSL 是否 ≥ 1.1.1(如 1.1.1w、3.0.13) - 运行
httpd -V | grep -i openssl或ldd $(which httpd) | grep ssl,确认 Apache 实际加载的是新版 OpenSSL,而非系统残留的 1.0.2 - 若不匹配,仅升级 Apache 无效;需重装 OpenSSL 并重新编译 Apache,或更换为自带新版 OpenSSL 的发行版(如 RHEL 8+/Ubuntu 20.04+)
验证与灰度上线建议
配置后重启服务(systemctl restart httpd),再分层验证:
- 用
openssl s_client -connect example.com:443 -tls1_3直连测试 TLS 1.3 是否可达 - 用 Chrome 打开页面 → F12 → Security 标签页,查看“Connection”是否显示 TLS 1.3
- 用 SSL Labs Test 全面扫描,重点关注 “Handshake Simulation” 中各客户端(含 Java 8u261、Android 7)是否成功协商 TLS 1.2
- 生产环境可先对部分 IP 段或子域名启用 TLS 1.3,观察日志中是否有大量
ssl_handshake_error,再全量推广











