必须在块内显式配置SSLHonorCipherOrder on(小写on),并配合精简SSLCipherSuite(如ECDHE类GCM套件)、SSLProtocol仅留TLSv1.2+,最后用openssl s_client实测验证。

要让 Apache 真正按你设定的加密套件顺序协商 TLS 连接,必须显式启用 SSLHonorCipherOrder on,且配置位置、配套指令和验证方式缺一不可——只写这一行,大概率不起作用。
必须在 VirtualHost 块内单独声明
该指令不继承、不全局生效。即使你在 /etc/apache2/mods-enabled/ssl.conf 或主配置里写了,只要 HTTPS 对应的 <virtualhost></virtualhost> 块里没出现,就等于没开。
- 正确做法:把它紧挨着
SSLEngine on和SSLCipherSuite放在同一虚拟主机块中 - 错误写法:
SSLHonorCipherOrder on只出现在顶层配置,虚拟主机里未重复或覆盖 - 大小写敏感:只能是
on,On、ON、1都被忽略且不报错
必须搭配精简、明确的 SSLCipherSuite
开启偏好只是“执行权”,SSLCipherSuite 才是“决策清单”。用 HIGH 或默认值会引入已淘汰套件(如 ECDHE-ECDSA-DES-CBC3-SHA),2026 年起 PCI DSS 和等保审计直接拒绝。
- 推荐最小安全基线(仅 TLS 1.2+):
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 - 禁用所有非前向保密套件:RSA 密钥交换类(
AES128-SHA)、DES、3DES、RC4、MD5、NULL - 务必同步限制协议:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1,只留 TLSv1.2/TLSv1.3
必须用 openssl 实测连接结果
Apache 启动成功 ≠ 配置生效。日志不报错,不代表客户端连上来时真用了你排在前面的强套件。
- 测试命令:
openssl s_client -connect example.com:443 -tls1_2 -cipher "ECDHE-RSA-RC4-SHA:AES128-SHA" - 如果返回的
Cipher是AES128-SHA(你SSLCipherSuite里靠前的强套件),说明服务器偏好生效 - 如果返回
ECDHE-RSA-RC4-SHA(弱套件,仅因客户端提了就用了),说明SSLHonorCipherOrder未起效或被覆盖 - 更可靠方式:运行
openssl s_client -connect example.com:443 -tls1_2 -cipher ALL查服务端实际返回列表,比看配置文件更可信
常见失效原因速查
配置写对了但没效果?重点排查这几项:
- 多个
<virtualhost></virtualhost>块重复定义,后加载的覆盖前一个(用apache2ctl -t -D DUMP_VHOSTS确认加载顺序) - 启用了 HTTP/2:旧版 mod_ssl + HTTP/2 组合下该指令可能被忽略;建议 Apache ≥ 2.4.26
- 在
.htaccess中设置——无效。SSLHonorCipherOrder是服务器级指令,不能放目录级配置 - OpenSSL 版本过低(低于 1.0.2u / 1.1.1k):部分新套件或行为支持不完整


















