apache强制启用tls 1.2和tls 1.3的关键是显式配置sslprotocol +tlsv1.2 +tlsv1.3,禁用所有旧协议;需确保openssl≥1.1.1且apache≥2.4.37,并配合专用密钥套件与sslhonorcipherorder on防止降级。

要让 Apache 通过 mod_ssl 强制使用现代 TLS 协议(即禁用老旧不安全版本,只启用 TLS 1.2 和 TLS 1.3),关键不在“升级”本身,而在于**显式声明允许的协议版本,并彻底排除旧版**。SSLProtocol 指令不支持自动“升级”,它靠黑白名单逻辑控制协商范围。
明确启用 TLS 1.2 和 TLS 1.3,禁用全部旧协议
直接写成 +TLSv1.2 +TLSv1.3 是最清晰、最可靠的方式:
- 避免使用
all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1这类写法——它隐含启用 TLSv1.2,但若未来 Apache 或 OpenSSL 新增协议(如 TLSv1.4),也会被自动包含,带来不可控风险 -
+TLSv1.2 +TLSv1.3表示“仅接受这两个”,其他一律拒绝,语义明确、行为可预测 - 该写法要求 Apache ≥ 2.4.37 且 OpenSSL ≥ 1.1.1;若环境不满足,TLSv1.3 将被忽略,仅生效 TLSv1.2
确保底层依赖真正支持 TLS 1.3
mod_ssl 本身不实现 TLS,它调用 OpenSSL。配置再正确,底层不支持也无效:
- 检查 OpenSSL 版本:
openssl version -a,确认输出为OpenSSL 1.1.1w、3.0.13或更高 - 确认 Apache 编译时链接的是这个新版 OpenSSL:
httpd -V | grep -i openssl或ldd $(which httpd) | grep ssl - 常见误区:只升级 Apache 二进制却不更新系统 OpenSSL 库,结果 TLSv1.3 始终无法协商成功
配合 SSLCipherSuite 避免协议降级漏洞
仅设 SSLProtocol 不足以防止客户端诱导回退到弱协议。需同步收紧密钥套件并强制服务端优先级:
- 对 TLS 1.2:用强 PFS+AEAD 套件,例如
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256 - 对 TLS 1.3:必须单独指定其专用套件,例如
TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256(不能混入 TLS 1.2 套件) - 加上
SSLHonorCipherOrder on,确保服务器按配置顺序选择,不被客户端乱序干扰
验证是否真正生效
配置后重启 Apache(systemctl restart httpd),再用以下方式交叉验证:
- 命令行测试 TLSv1.3:
openssl s_client -connect yoursite.com:443 -tls1_3 2>/dev/null | grep Protocol,应输出Protocol : TLSv1.3 - 浏览器访问 → 开发者工具 → Security 标签页 → 查看“Connection”详情
- 用 SSL Labs Test 全面扫描,重点关注 “Handshake Simulation” 中各客户端实际协商出的协议版本











