在 Apache 服务器的 SSL 密码套件中禁用 RC4

在 Apache 服务器的 SSL 密码套件中禁用 RC4

请参阅我自己的答案中的编辑部分;它们包含对这个难题的解释

我正在尝试禁用在 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"

相关内容