请参阅我自己的答案中的编辑部分;它们包含对这个难题的解释。
我正在尝试禁用在 CentOS 6.5 VPS 上运行的 Apache 2.2.9 服务器的 RC4,但似乎无法成功。
安装了最近购买的商业验证证书,并且 SSL 连接运行良好,但我想尽可能好地配置,以“加强安全性”,正如一些教程所说的那样。
使用 Qualys SSL Labs 检查配置,结果页面显示“此服务器接受 RC4 密码,该密码较弱。等级上限为 B。”
但是,我已将其放入 ssl.conf 中:
SSLCipherSuite HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!SSLv2:!SSLv3
我已保存了答案中给出的脚本这个问题在名为 test-ssl-ciphers.sh 的文件中,将 IP 地址更改为环回地址。结果如下./test-ssl-ciphers.sh | grep -i "RC4"
:
Testing ECDHE-RSA-RC4-SHA...NO (sslv3 alert handshake failure)
Testing ECDHE-ECDSA-RC4-SHA...NO (sslv3 alert handshake failure)
Testing AECDH-RC4-SHA...NO (sslv3 alert handshake failure)
Testing ADH-RC4-MD5...NO (sslv3 alert handshake failure)
Testing ECDH-RSA-RC4-SHA...NO (sslv3 alert handshake failure)
Testing ECDH-ECDSA-RC4-SHA...NO (sslv3 alert handshake failure)
Testing RC4-SHA...NO (sslv3 alert handshake failure)
Testing RC4-MD5...NO (sslv3 alert handshake failure)
Testing RC4-MD5...NO (sslv3 alert handshake failure)
Testing PSK-RC4-SHA...NO (no ciphers available)
Testing KRB5-RC4-SHA...NO (no ciphers available)
Testing KRB5-RC4-MD5...NO (no ciphers available)
Testing EXP-ADH-RC4-MD5...NO (sslv3 alert handshake failure)
Testing EXP-RC4-MD5...NO (sslv3 alert handshake failure)
Testing EXP-RC4-MD5...NO (sslv3 alert handshake failure)
Testing EXP-KRB5-RC4-SHA...NO (no ciphers available)
Testing EXP-KRB5-RC4-MD5...NO (no ciphers available)
每行都包含“NO”,根据脚本,这意味着服务器不支持指定的密码组合。
此外,该命令grep -i -r "RC4" /etc/httpd
只给我上面提到的 ssl.conf 文件。
此外,openssl ciphers -V
在我的密码套件上运行时根本没有显示任何 RC4 密码,这对于配置字符串来说是有意义的。
因此,我有点搞不懂为什么 SSL 检查网站会告诉我“服务器接受 RC4”。他们甚至列出了以下被接受的密码:
TLS_RSA_WITH_RC4_128_MD5
TLS_RSA_WITH_RC4_128_SHA
TLS_ECDHE_RSA_WITH_RC4_128_SHA
有人能给出可能的解释吗?我做错了什么?也许还有其他地方可以配置对 RC4 或“接受”的支持?
谢谢。
[编辑] 使用家中虚拟机中的 CentOS 6.6,我再次针对我的 VPS 运行该脚本,使用的是其域名而不是环回地址。此设置意味着密码列表由 VM 中的 openssl 实例提供:在得出 YES 的密码中,我仍然没有 RC4。
答案1
在安装更新的证书时,我发现问题是由在 ISPConfig 中指定(针对域和每个子域)HTTPS 所需的整套数据引起的:证书、私钥、CA 链等。
换句话说,删除数据集会导致 Qualys 测试将域评级为 A,同时删除有关 RC4 的警告。将详细信息放回去会导致警告再次出现,并且评级再次被限制在 B,这让因果关系不再令人怀疑。
就好像为每个虚拟主机提供详细信息以某种方式创建了一个新环境,其中的一些默认值覆盖了我在 ssl.conf 中指定的密码套件。很奇怪。
解决方案是在Apache 指令每个 vhost 的文本区域。这是我在配置中得到的 A 级评分:
SSLProtocol ALL -SSLv2 -SSLv3
SSLHonorCipherOrder on
# Compression is disabled by default on my distribution (CentOS 6)
# SSLCompression off
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
编辑(2017-05-16):关于此问题的另一个发现:SSLCipherSuite
必须指定。我不明白为什么该特定指令虽然在服务器级别指定,但不会自动应用于虚拟主机配置。我在 CentOS 6.9 上运行 Apache 2.2.15。
编辑(2018-06-18):更多信息。我刚刚发现该SSLCipherSuite
指令可以指定一次,它将应用于所有虚拟主机:在基本 mod_ssl 配置文件中(在 CentOS 6 上,该文件位于/etc/httpd/conf.d/ssl.conf
),您只需指定该指令外部默认虚拟主机的。Apache 2.2 文档指出,此指令的默认值为SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
。我认为这就是 RC4 密码的来源:在没有任何规范的情况下(对我来说就是这种情况,因为在“全局”上下文中没有规范),将应用默认值。这种理解结束了对我来说一直是个谜的问题。讽刺的是,当我找到这个解释时,我正要切换到 CentOS 7!HTH。
答案2
SSLCipherSuite HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!SSLv2:!SSLv3
^^^^^^^
坏主意。禁用所有 SSLv3 密码会导致禁用 TLS1.0 和 TLS1.1 可用的密码,只留下 TLS1.2 新引入的几个密码(如果您的服务器支持 TLS1.2)
因此,我有点搞不懂为什么 SSL 检查网站会告诉我“服务器接受 RC4”。他们甚至列出了以下被接受的密码:
确保本地和外部测试都访问同一个服务器(IP 地址)。我见过很多网站位于example.com
不同的主机上www.example.com
,因此测试结果不同。
答案3
Qualys SSL 实验室似乎对默认主机等非常敏感。检查该 IP 地址上的所有 HTTPS VirtualHosts 是否使用完全相同的设置(证书文件除外),我遇到过类似的问题,其中一些 Qualys 测试针对我的目标 VirtualHost 进行测试,而一些测试似乎选择了默认 VirtualHost。我的目标虚拟主机仅启用了一个密码,但 Qualys 从默认虚拟主机中找到了一个更大的列表。
我还找到了一个更好看的脚本这里提供有关 SSL 测试的更详细信息。
答案4
在我的 Fedora 25 上,Apache/2.4.25 密码由加密策略处理(请参阅 /etc/cryptopolicies/backends)。默认设置已完全禁用 RC4,因此无需在 Apache 设置中篡改密码。除非确保您使用最新的 ssl.conf,因为它不是默认安装的,而是作为 conf.d 目录中的 ssl.conf.rpmnew 保留。
为了配置 SSL,我只需指定证书、ServerName 和 DocumentRoot。对于 Squirrelmail 来说就是这样。
SSLCertificateFile /etc/letsencrypt/live/mail.xxxx.dk/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mail.xxxx.dk/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mail.xxxx.dk/chain.pem
SSLCACertificateFile /etc/letsencrypt/live/mail.xxxx.dk/fullchain.pem
ServerName mail.xxxx.dk:443
DocumentRoot "/usr/share/squirrelmail"