必须开启SSLHonorCipherOrder on并置于VirtualHost块内,配合严格筛选的SSLCipherSuite(如ECDHE-GCM套件)和TLS 1.2+协议,再通过openssl s_client实测验证,否则客户端仍可协商弱套件。

要让 Apache 真正按你写的顺序选加密套件,必须开启 SSLHonorCipherOrder on,否则客户端提什么你就用什么——哪怕你把最强的 ECDHE-GCM 套件写在最前面,也拦不住客户端塞个 RC4 或 SHA1 过来协商成功。
必须放在 VirtualHost 块内
这个指令不继承、不全局生效。即使你在 /etc/apache2/mods-enabled/ssl.conf 或主配置里写了,只要 HTTPS 对应的 <VirtualHost *:443> 里没显式写上,就等于没开。
- 正确位置:紧挨着
SSLEngine on和SSLCipherSuite,同在一个<VirtualHost>块中 - 大小写敏感:
on是唯一有效值,On、ON、1都被忽略且不报错 - 检查是否被覆盖:运行
apache2ctl -t -D DUMP_VHOSTS(Debian/Ubuntu)或httpd -t -D DUMP_VHOSTS(RHEL/CentOS),确认目标虚拟主机确实加载且未被后加载的配置块覆盖
必须配合严格筛选的 SSLCipherSuite
只开 SSLHonorCipherOrder 不配好 SSLCipherSuite,等于有枪没弹。默认值可能含已淘汰套件(如 DES-CBC3-SHA),2026 年起 PCI DSS、等保审计会直接拒绝。
- 禁用所有无前向保密(PFS)的套件:RSA 密钥交换类(如
AES128-SHA)、DES、3DES、RC4、MD5、NULL - 避免用
HIGH这类模糊关键字——它随 OpenSSL 版本浮动,不可控 - 推荐最小安全基线(TLS 1.2+):
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 - 务必搭配:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1(仅留 TLSv1.2/TLSv1.3)
验证是否真生效,别信配置文件
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:COMPLEMENTOFALL 2>/dev/null | grep Cipher
常见失效原因
很多配置看着对,实测却无效,往往卡在这几个点:
- 多个
<VirtualHost>块重复定义SSLHonorCipherOrder,后加载的覆盖前一个 - 在
.htaccess中设置——该指令是服务器级指令,目录级配置无效 - 启用了 HTTP/2 但 Apache 版本过低(mod_ssl + HTTP/2 组合下会忽略该指令
- OpenSSL 版本太老(


















