apache的sslprotocol指令需显式声明tls版本并分阶段验证,依赖openssl版本匹配(≥1.1.1支持tlsv1.3),推荐写法为+tlsv1.2 +tlsv1.3,配套sslengine、sslhonorcipherorder及严格密钥套件配置,并通过实测确认协商结果。

确认底层能力是否支持目标协议
配置前必须验证 OpenSSL 和 Apache 是否真能跑 TLSv1.2 或 TLSv1.3:
- 运行
openssl version -a查看 OpenSSL 版本:≥ 1.1.1 才支持 TLSv1.3;1.0.2 只能到 TLSv1.2 - 运行
httpd -V | grep -i openssl确认 Apache 实际链接的是哪个 OpenSSL(避免系统有多个版本但 Apache 仍用旧版) - 若 OpenSSL 是 1.0.2 或更低,写
+TLSv1.3会被静默忽略,日志里也不会报错
用白名单写法精准控制协议启用
别依赖 all -XXX 这类模糊排除,它语义不清、易留隐患、且不同版本解释可能不一致:
- 推荐写法:
SSLProtocol +TLSv1.2 +TLSv1.3(Apache 2.4.37+) - 老版本 Apache(如 2.4.29)不识别
+前缀,改用:SSLProtocol TLSv1.2 TLSv1.3 - 绝对不要只写
+TLSv1.3:Java 8u251、Android 4.4、IE11 on Win7 等大量合法客户端会直接断连 - 大小写敏感:
tlsv1.2可能被忽略,必须小写全拼tls1_2对应命令行测试,配置中写TLSv1.2
分阶段收紧,避免服务中断
一次性关闭 TLSv1.0/1.1 容易导致银行控件、嵌入式设备、旧 Java 客户端失联。稳妥做法是三步走:
-
观察期:先设
SSLProtocol all -SSLv2 -SSLv3,开启日志记录%{SSL_PROTOCOL}x,统计真实流量中各协议占比 -
限制期:确认 TLSv1.2+ 占比超 99%,再升级为
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 -
加固期:最后切换到
+TLSv1.2 +TLSv1.3,并同步更新密钥套件与排序策略
必须配套的关键配置
只改 SSLProtocol 不够,协议能否真正按预期协商,还取决于这些:
-
SSLEngine on必须在虚拟主机内启用,否则指令无效 -
SSLHonorCipherOrder on强制服务端优先选择强套件,防止客户端挑弱算法绕过安全策略 -
SSLCipherSuite要严格区分:TLSv1.3 必须用TLS_AES_128_GCM_SHA256等原生命名套件,不能混入ECDHE-RSA-AES256-GCM-SHA384等 TLSv1.2 套件,否则 OpenSSL 会拒绝 TLSv1.3 握手 - 确保私钥强度:RSA 至少 2048 位,ECDSA 推荐 secp256r1 或更高;1024 位 RSA 在 TLSv1.3 下会静默失败
验证是否真正生效
重启 Apache 后,不能只信配置语法正确,要实测协商结果:
- 终端测试:
openssl s_client -connect example.com:443 -tls1_2 2>/dev/null | grep "Protocol"应输出Protocol : TLSv1.2 - 同样测 TLSv1.3:
-tls1_3参数,确认返回TLSv1.3 - 浏览器访问后按 F12 → Security 标签页,查看 Connection 明细
- 用 SSL Labs Server Test,重点看 “Handshake Simulation” 表格中各客户端实际协商到的协议











