SSLHonorCipherOrder 是 Apache 的 SSL/TLS 指令,用于强制服务器优先采用自身配置的密码套件顺序而非客户端提议顺序;开启它才能落实服务器加密偏好,满足 PCI DSS、等保及 TLS 最佳实践要求。

SSLHonorCipherOrder 是什么,为什么需要开启
SSLHonorCipherOrder 是 Apache 的一个 SSL/TLS 指令,控制服务器是否强制使用自己配置的密码套件顺序(即 SSLCipherSuite 中定义的顺序),而不是接受客户端提出的优先级。默认是 Off,意味着即使你写了强密码在前面,只要客户端支持弱密码且把它排在自己列表首位,Apache 就可能协商出那个弱密码。
开启它,才能真正落实“服务器加密偏好”——这是 PCI DSS、等保和现代 TLS 最佳实践的硬性要求。
如何正确启用 SSLHonorCipherOrder 并验证生效
- 必须在启用 HTTPS 的
块内设置,全局配置(如 ssl.conf)中设了但虚拟主机里没继承或被覆盖,就无效
- 语法是:
SSLHonorCipherOrder on(注意大小写,On 或 1 不被识别)
- 它必须和
SSLCipherSuite 配合使用;只开 SSLHonorCipherOrder 而不精调 SSLCipherSuite,等于有枪没弹
- 修改后必须重启 Apache:
sudo systemctl restart apache2(Debian/Ubuntu)或 sudo systemctl restart httpd(RHEL/CentOS)
- 验证是否生效:用
openssl s_client -connect example.com:443 -cipher "AES128-SHA:ECDHE-RSA-RC4-SHA" 测试——如果返回的是 AES128-SHA(你 SSLCipherSuite 里靠前的强套件),说明服务器偏好起效;若返回 ECDHE-RSA-RC4-SHA(弱套件,仅因客户端提了就用了),说明 SSLHonorCipherOrder 未生效或被覆盖
常见失效原因和排查点
-
SSLHonorCipherOrder 被多个 块重复定义,后加载的覆盖前一个(检查 apache2ctl -t -D DUMP_VHOSTS 看加载顺序)
- 使用了旧版 OpenSSL(
- 在
.htaccess 中设置无效——SSLHonorCipherOrder 是服务器级指令,不能放在目录级配置里
- 启用了 HTTP/2:某些旧版 mod_ssl + HTTP/2 组合下,该指令会被忽略;确认
Protocols h2 http/1.1 与 SSLHonorCipherOrder on 兼容(Apache ≥ 2.4.26 更稳妥)
- 错误日志里没报错,但实际没生效——用
openssl s_client -connect host:443 -tls1_2 -cipher "ALL:COMPLEMENTOFALL" 查看服务端实际返回的可用套件列表,比依赖配置更可信
SSLCipherSuite 怎么配才让 SSLHonorCipherOrder 有意义
- 不要用宽泛的
SSLCipherSuite HIGH:!aNULL:!MD5:!RC4,它仍可能包含已淘汰的 ECDHE-ECDSA-DES-CBC3-SHA 等
- 推荐起点(兼容 Win7+/Android 4.4+):
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
- 必须加
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1(禁用已弃用协议),否则光调密码套件没意义
- 如果业务必须支持老客户端(如 IE8/XP),需单独建虚拟主机并隔离配置,不要混用——混用会导致
SSLHonorCipherOrder 在强安全上下文中失效
块内设置,全局配置(如 ssl.conf)中设了但虚拟主机里没继承或被覆盖,就无效 SSLHonorCipherOrder on(注意大小写,On 或 1 不被识别) SSLCipherSuite 配合使用;只开 SSLHonorCipherOrder 而不精调 SSLCipherSuite,等于有枪没弹 sudo systemctl restart apache2(Debian/Ubuntu)或 sudo systemctl restart httpd(RHEL/CentOS) openssl s_client -connect example.com:443 -cipher "AES128-SHA:ECDHE-RSA-RC4-SHA" 测试——如果返回的是 AES128-SHA(你 SSLCipherSuite 里靠前的强套件),说明服务器偏好起效;若返回 ECDHE-RSA-RC4-SHA(弱套件,仅因客户端提了就用了),说明 SSLHonorCipherOrder 未生效或被覆盖 -
SSLHonorCipherOrder被多个块重复定义,后加载的覆盖前一个(检查apache2ctl -t -D DUMP_VHOSTS看加载顺序) - 使用了旧版 OpenSSL(
- 在
.htaccess中设置无效——SSLHonorCipherOrder是服务器级指令,不能放在目录级配置里 - 启用了 HTTP/2:某些旧版 mod_ssl + HTTP/2 组合下,该指令会被忽略;确认
Protocols h2 http/1.1与SSLHonorCipherOrder on兼容(Apache ≥ 2.4.26 更稳妥) - 错误日志里没报错,但实际没生效——用
openssl s_client -connect host:443 -tls1_2 -cipher "ALL:COMPLEMENTOFALL"查看服务端实际返回的可用套件列表,比依赖配置更可信
SSLCipherSuite 怎么配才让 SSLHonorCipherOrder 有意义
- 不要用宽泛的
SSLCipherSuite HIGH:!aNULL:!MD5:!RC4,它仍可能包含已淘汰的 ECDHE-ECDSA-DES-CBC3-SHA 等
- 推荐起点(兼容 Win7+/Android 4.4+):
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
- 必须加
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1(禁用已弃用协议),否则光调密码套件没意义
- 如果业务必须支持老客户端(如 IE8/XP),需单独建虚拟主机并隔离配置,不要混用——混用会导致
SSLHonorCipherOrder 在强安全上下文中失效
SSLCipherSuite HIGH:!aNULL:!MD5:!RC4,它仍可能包含已淘汰的 ECDHE-ECDSA-DES-CBC3-SHA 等 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1(禁用已弃用协议),否则光调密码套件没意义 SSLHonorCipherOrder 在强安全上下文中失效 Apache 的 TLS 策略最终取决于三者联动:SSLProtocol 切协议范围、SSLCipherSuite 定套件顺序、SSLHonorCipherOrder 决定是否尊重这个顺序。少一个,前面两个就白配。











