apache中强制启用现代tls版本需满足:openssl≥1.1.1(tls 1.3)或≥1.0.1(tls 1.2),配置sslprotocol +tlsv1.2 +tlsv1.3,仅用tls 1.3专用密钥套件,并启用sslengine on和sslhonorcipherorder on。

Apache 中通过 mod_ssl 强制启用现代 TLS 版本,核心在于正确使用 SSLProtocol 指令,并配合 OpenSSL 版本、密钥套件与协议协商逻辑。仅靠指令写法本身无法生效,必须满足底层依赖和配置协同。
确认 OpenSSL 支持 TLS 1.2 和 TLS 1.3
Apache 本身不实现 TLS,mod_ssl 依赖 OpenSSL(或 BoringSSL)提供协议能力。TLS 1.3 要求 OpenSSL ≥ 1.1.1;TLS 1.2 则需 ≥ 1.0.1。低于此版本的 OpenSSL(如 1.0.2 或更早)无法启用 TLS 1.3,即使 Apache 是 2.4.48 也无效。
- 运行
openssl version -a查看当前系统 OpenSSL 版本 - 检查 Apache 实际链接的 OpenSSL:
httpd -V | grep -i openssl或ldd $(which httpd) | grep ssl - 若显示
OpenSSL 1.0.2k或更低,需升级系统 OpenSSL 或重新编译 Apache 链接新版
SSLProtocol 指令的推荐写法
避免使用模糊的 all -TLSv1 -TLSv1.1 等排除式写法,它可能意外禁用 TLS 1.2(尤其在旧版 Apache 中)。现代配置应显式声明支持的协议,确保语义明确、行为可预期。
- 仅启用 TLS 1.2 和 TLS 1.3(最常用且兼顾兼容性):
SSLProtocol +TLSv1.2 +TLSv1.3 - 若只接受 TLS 1.3(极严格场景,注意客户端兼容性):
SSLProtocol -all +TLSv1.3 - 禁用所有旧协议的等效写法(不推荐用于生产):
SSLProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1(仍需确保 TLSv1.2/TLSv1.3 已被启用)
配套关键配置不可省略
SSLProtocol 单独启用协议只是第一步。若密钥套件未对齐、服务器未按序协商,TLS 1.3 仍无法建立连接。
-
必须使用 TLS 1.3 专用密钥套件:在
SSLCipherSuite中只写入TLS_AES_128_GCM_SHA256、TLS_AES_256_GCM_SHA384、TLS_CHACHA20_POLY1305_SHA256—— 不能混入任何 ECDHE-RSA、DHE 等 TLS 1.2 套件,否则 OpenSSL 协商失败 -
启用密码顺序控制:
SSLHonorCipherOrder on,确保服务器优先选择配置中靠前的套件(对 TLS 1.3 虽无实际协商影响,但属最佳实践) -
虚拟主机内启用 SSL 引擎:
SSLEngine on必须存在,且该<virtualhost></virtualhost>明确监听 443 端口
验证是否真正生效
重启 Apache 后,不能只看配置文件语法是否通过,要实测协议协商结果:
- 终端测试 TLS 1.3 连接:
openssl s_client -connect yourdomain.com:443 -tls1_3 2>/dev/null | grep "Protocol "—— 应输出Protocol : TLSv1.3 - 浏览器访问后打开开发者工具 → Security 标签页 → 查看“Connection”字段
- 用 SSL Labs Test 全面检测,确认协议支持列表中包含 TLS 1.3,且无降级警告











