Apache通过mod_ssl启用TLS 1.3需满足三要素:OpenSSL≥1.1.1、配置SSLProtocol +TLSv1.2 +TLSv1.3、仅用TLS 1.3专用密钥套件(如TLS_AES_128_GCM_SHA256),缺一不可,否则协商失败或回退。

Apache 通过 mod_ssl 启用 TLS 1.3 能显著缩短握手耗时(从 1-RTT 降至 0-RTT 或 1-RTT 快速恢复),但实际生效不只靠“开个开关”,关键在 OpenSSL 版本、协议显式声明、密钥套件隔离三者协同。下面直击实操要点。
确认底层 OpenSSL 支持 TLS 1.3
mod_ssl 本身不实现 TLS,它只是 OpenSSL 的封装接口。TLS 1.3 是否可用,完全取决于 Apache 编译时链接的 OpenSSL 版本。
- 运行 openssl version -a 查看系统 OpenSSL 版本,必须 ≥ 1.1.1(推荐 1.1.1w 或 3.0.x)
- 运行 httpd -V | grep -i openssl 或 ldd $(which httpd) | grep ssl,确认 Apache 实际加载的是该新版 OpenSSL,而非系统旧版(如 CentOS 7 默认的 1.0.2)
- 若版本不符:Ubuntu/Debian 可升级 openssl 并重装 apache2;RHEL/CentOS 8+、Ubuntu 20.04+ 通常已满足;老系统需手动编译 OpenSSL + 重新编译 Apache
配置中明确启用 TLS 1.2 和 TLS 1.3
不能依赖 “all” 或模糊禁用写法,否则容易误关 TLS 1.2 导致大量客户端断连。
- 在 ssl.conf 或虚拟主机的
块内,设置:
SSLProtocol +TLSv1.2 +TLSv1.3 - 避免使用
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2这类写法——它会把 TLS 1.2 也禁掉 - 确保 SSLEngine on 已开启,且监听 443 端口的虚拟主机已正确定义
仅使用 TLS 1.3 专用密钥套件
TLS 1.3 彻底移除了 RSA 密钥交换和传统 AEAD 套件,混用 TLS 1.2 套件会导致协商失败或回退到旧协议。
- 配置必须为:
SSLCipherSuite TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 - 不要追加任何含
ECDHE-、RC4、AES128-SHA等 TLS 1.2 风格的套件 - 建议保留 SSLHonorCipherOrder on,虽对 TLS 1.3 协商无实质影响,但保持配置一致性
验证是否真正启用 TLS 1.3
重启服务后,别只信浏览器地址栏小锁图标——要查协议层真实协商结果。
- 终端执行:
openssl s_client -connect yourdomain.com:443 -tls1_3
成功时输出中应含Protocol : TLSv1.3和对应密钥套件名 - Chrome / Edge 浏览器按 F12 → Security 标签页 → 查看“Connection”字段,明确显示 “TLS 1.3”
- 用 SSL Labs Test 全面扫描,它会单独列出 TLS 1.3 支持状态、支持的套件及兼容性警告
注意:Java 客户端(如 HttpClient)需 Java 11+ 才默认支持 TLS 1.3;Java 8u261+ 可加 JVM 参数 -Djdk.tls.client.protocols=TLSv1.3 启用。Apache 自身不支持 TLS 1.3 的 0-RTT 模式,这是设计上的主动限制。











