apache https安全配置需严格设定sslciphersuite白名单(如ecdhe-rsa-aes128-gcm-sha256:ecdhe-rsa-aes256-gcm-sha384)、启用sslhonorcipherorder on,并同步收紧sslprotocol至+tlsv1.2 +tlsv1.3,缺一不可。

Apache 本身不生成或执行加密算法,mod_ssl 只是 OpenSSL 的配置接口。真正决定哪些套件可用、按什么顺序协商的,是 SSLCipherSuite 的字符串写法 和 SSLHonorCipherOrder on 的配合。精准排序不是“把强套件写前面就行”,而是要明确排除脆弱类型、限定密钥交换与认证机制、并强制服务端主导选择。
只用白名单,别碰黑名单
避免使用 !RC4:!MD5:!aNULL 这类排除式写法——它依赖 OpenSSL 默认列表,版本一变就可能漏掉新识别出的问题套件(比如某些 ECDHE-DES-CBC3-SHA 变体在 2026 年已被 PCI DSS 明确拒绝)。应直接列出你允许的完整套件链:
-
ECDHE-ECDSA-AES128-GCM-SHA256(适用于 ECDSA 证书) -
ECDHE-RSA-AES128-GCM-SHA256(兼容性最广的基线) -
ECDHE-RSA-AES256-GCM-SHA384(更高强度,适合金融类站点) -
ECDHE-RSA-CHACHA20-POLY1305(移动网络友好,需 OpenSSL ≥ 1.1.1)
中间用英文冒号 : 连接,**不能有空格**。顺序即优先级:客户端支持时,服务器优先选排第一的。
必须搭配 SSLHonorCipherOrder on
这个指令必须出现在同一个 <virtualhost></virtualhost> 块里,紧挨着 SSLEngine on 和 SSLCertificateFile。只写在全局 ssl.conf 里无效,大小写也必须是 on(不是 On 或 1)。
它的作用是让 Apache 忽略客户端发来的密码套件列表顺序,只按你写的 SSLCipherSuite 从左到右挑第一个它支持的。没有它,哪怕你把 GCM 套件放最前,只要客户端把 RC4 放首位且自己支持,就可能协商出 RC4。
协议版本和套件要协同收紧
SSLCipherSuite 再严格,如果 SSLProtocol 还开着 TLSv1.0,攻击者就能降级到旧协议再挑弱套件。所以必须同步配置:
-
SSLProtocol +TLSv1.2 +TLSv1.3(推荐,需 Apache ≥ 2.4.37 + OpenSSL ≥ 1.1.1) - 或保守写法:
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
TLS 1.3 的套件(如 TLS_AES_128_GCM_SHA256)需单独指定,不参与传统 SSLCipherSuite 排序,但也要写进配置中确保启用。
验证是否真按你的顺序生效
别信配置文件语法正确就万事大吉。用以下命令实测:
openssl s_client -connect example.com:443 -tls1_2 -cipher "ECDHE-RSA-AES128-GCM-SHA256:AES128-SHA" 2>/dev/null | grep Cipher如果返回 Cipher : ECDHE-RSA-AES128-GCM-SHA256,说明排序起效;如果返回 AES128-SHA,就是 SSLHonorCipherOrder 没开或没生效。
更彻底的方式是运行:
openssl s_client -connect example.com:443 -tls1_2 -ciphers ALL 2>/dev/null | grep Cipher
看输出里实际列出的套件,是否完全匹配你配置的白名单内容。










