sslhonorcipherorder必须在块内设为on(大小写敏感),不可在全局配置或.htaccess中设置;须与sslciphersuite配合使用,并通过openssl s_client实测验证是否生效。
sslhonorcipherorder 必须在启用 https 的 <virtualhost></virtualhost> 块内设置,全局配置(如 ssl.conf)中设了但虚拟主机里没继承或被覆盖,就无效。
正确写法与位置
语法严格区分大小写:SSLHonorCipherOrder on(On、1 或 yes 均不被识别)。
- 必须放在
<virtualhost></virtualhost>段内,不能写在.htaccess或非 HTTPS 虚拟主机中 - 若同时配置多个 HTTPS 站点,每个
<virtualhost></virtualhost>都需单独设置(后加载的会覆盖前一个) - 建议与
SSLCipherSuite配合使用——只开SSLHonorCipherOrder而不精调套件顺序,等于有枪没弹
必须配合 SSLCipherSuite 使用
服务器按你指定的套件顺序优先选择,前提是这些套件本身被允许且双方都支持。
- 例如:
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256 - TLS 1.3 需单独配置:加入
TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384等专用套件 - 禁用弱套件(如
RC4、MD5、EXPORT)可直接在SSLCipherSuite中排除
验证是否真正生效
别只看配置文件,用 OpenSSL 实际测试最可靠:
- 运行:
openssl s_client -connect example.com:443 -cipher "AES128-SHA:ECDHE-RSA-RC4-SHA" -tls1_2 - 如果返回的是
AES128-SHA(你SSLCipherSuite里靠前的强套件),说明服务器偏好起效 - 如果返回
ECDHE-RSA-RC4-SHA(弱套件,仅因客户端提了就用了),说明指令未生效或被覆盖 - 更全面检查可用套件:
openssl s_client -connect example.com:443 -tls1_2 -cipher "ALL:COMPLEMENTOFALL"
常见失效原因
配置无报错 ≠ 实际生效。重点排查:
- 多个
<virtualhost></virtualhost>块重复定义该指令,后加载的覆盖前一个(用apache2ctl -t -D DUMP_VHOSTS查加载顺序) - Apache 版本低于 2.4.8 或 OpenSSL 低于 1.0.2,行为不可靠
- 启用了 HTTP/2:旧版 mod_ssl + HTTP/2 组合下可能忽略该指令;建议 Apache ≥ 2.4.26
- 证书链或私钥权限错误、SELinux 限制读取等底层问题,也会导致 SSL 配置整体不加载











