Apache需搭配OpenSSL 1.1.1+才能支持TLS 1.3,配置应设SSLProtocol +TLSv1.2 +TLSv1.3并仅用TLS 1.3专用密钥套件,否则协商失败。

Apache HTTP Server 本身不直接实现 TLS 协议,mod_ssl 是其通过 OpenSSL(或 BoringSSL)提供 SSL/TLS 功能的模块。TLS 1.3 的支持取决于所链接的 OpenSSL 版本,而非 mod_ssl 本身的版本。Apache 2.4.37 及以上版本在配合 OpenSSL 1.1.1+ 时,可原生支持 TLS 1.3。
确认 OpenSSL 和 Apache 版本兼容性
Apache 必须使用 OpenSSL 1.1.1 或更高版本(如 1.1.1w、3.0.x、3.1.x)才能启用 TLS 1.3。仅升级 Apache 而不更新底层 OpenSSL 无效。
- 检查当前 OpenSSL 版本:
openssl version -a - 确认 Apache 编译时链接的 OpenSSL:
httpd -V | grep -i "openssl\|compiled"或ldd $(which httpd) | grep ssl - 若输出中显示 OpenSSL
启用 TLS 1.3 的核心配置项
在 ssl.conf 或虚拟主机的 块中,确保以下指令正确设置:
-
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2→ 不推荐此写法,会禁用 TLS 1.2;应显式保留所需协议 - 推荐写法:
SSLProtocol +TLSv1.2 +TLSv1.3(明确启用 1.2 和 1.3,禁用旧协议) -
SSLCipherSuite TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256→ TLS 1.3 专用密钥套件,必须包含且不能混用 TLS 1.2 套件 -
SSLHonorCipherOrder on→ 确保服务器按配置顺序选择密钥套件(对 TLS 1.3 无实际影响,但建议保持)
验证 TLS 1.3 是否生效
配置完成后重启 Apache(systemctl restart httpd 或 apachectl graceful),再通过以下方式验证:
- 使用 OpenSSL 测试:
openssl s_client -connect example.com:443 -tls1_3,若成功连接并显示Protocol : TLSv1.3,说明启用成功 - 使用浏览器开发者工具(Security 标签页)查看连接详情,确认协议为 “TLS 1.3”
- 在线检测工具如 SSL Labs Test,会明确列出支持的协议版本和密钥套件
注意事项与常见问题
TLS 1.3 是不向后兼容的协议升级,部分老旧客户端(如 Android 4.4、Java 7/8 默认 JSSE、某些嵌入式设备)可能无法协商成功,需权衡兼容性。
- Java 客户端(如 HttpClient)需 Java 11+ 才默认支持 TLS 1.3;Java 8u261+ 可通过 JVM 参数启用:
-Djdk.tls.client.protocols=TLSv1.3 - Apache 不支持 TLS 1.3 的 0-RTT 模式(出于安全考虑,默认禁用且无配置开关)
- 若启用 TLS 1.3 后出现握手失败,优先检查
SSLCipherSuite是否误加了 TLS 1.2 套件(如ECDHE-...),这会导致 OpenSSL 拒绝协商 TLS 1.3
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










