我正在尝试测试一个补丁贵宾犬的脆弱性这涉及在我的 Web 服务器上禁用 SSLv3。为了首先在非生产环境中测试这一点,我在 VirtualHost 上为不同的测试服务器设置了 SSLProtocol。我的配置如下所示:
<VirtualHost *:443>
SSLEngine On
SSLProtocol All -SSLv2 -SSLv3
ServerName test.mysite.com
# bunch of other stuff omitted
</VirtualHost>
但是,即使重新启动 Apache,我的测试站点仍然被声称存在漏洞。这能正常工作吗?我想知道我是否必须在全局 SSL 配置中设置它,或者是否有其他微妙的原因导致设置不起作用。
答案1
您只能为配置文件中的第一个 VirtualHost 设置 SSLProtocol。所有后续 VirtualHost 条目都将从第一个条目继承该设置,并默认忽略其自己的设置,因为OpenSSL 错误。
有一个相应的mod_ssl 的错误报告,但正如错误报告中所述,该问题需要在 OpenSSL 中解决(证书是继承的,但协议不是)。
必须为每个 VirtualHost 单独设置密码套件,否则您将得到默认列表,其中包括许多不安全的密码。另外,请注意,不支持服务器名称指示 (SNI) 的旧客户端将始终使用默认主机(除非阻止使用SSLStrictSNIVHostCheck
),这可能会混淆您的测试。
简而言之,您应该能够为每个虚拟主机指定自定义密码套件和证书,但是在修复错误之前,不要期望每个虚拟主机的自定义协议都有正确的行为。
我在使用 Apache 2.4 和 modssl 与 OpenSSL 1.0.1k 时遇到了这个问题,我预计 Apache 2.2 也会遇到同样的问题。
更新(2016 年 10 月):OpenSSL 漏洞于 2016 年 10 月 13 日被标记为已解决。然而,它是大量未解决问题的一部分,尽管提供了“部分修复”,但问题从未得到完全解决。
更新(2018 年 4 月):重新提交的 OpenSSL 错误现在有一个补丁可用(截至 2018 年 4 月 9 日)。此补丁将更改配置了多个 SNI 虚拟主机的 Apache 实例的行为:
拒绝不符合 vhost SSLProtocol 的连接
这是使用 2.4.27 开发和测试的,并已在该版本投入生产。该补丁针对 2.4.33 进行了修改并进行了简单测试。
这将根据为基于 SNI 匹配的虚拟主机配置的 SSLProtocol 检查连接的版本。由于连接最初是使用为端口的默认主机配置的 SSLProtocol 建立的,因此默认主机必须包含任何虚拟主机将支持的所有协议。
此补丁将 APR_EMISMATCH 的额外返回状态添加到 init_vhost 函数,以便使用 OpenSSL 注册的 ssl_callback_ServerNameIndication 回调可以返回致命警报 SSL_AD_PROTOCOL_VERSION。这旨在对 ClientHello 产生与指定不包含相关版本的 SSLProtocol 相同的响应。由于 SNI 回调是在处理 ClientHello 期间和生成响应之前调用的,因此它似乎正是这样做的。
如果您突然看到以下格式的消息:
Rejecting version [version] for servername [hostname]
然后您应该仔细检查SSLProtocol
您的默认主机。
答案2
如果每个 Vhost 监听不同的 IP,则可以为每个 Vhost 使用不同的 SSL 协议。
示例:某个主机允许 TLSv1,而其他所有主机仅允许 TLSv1.1 和 TLSv1.2,并且有一个主机仅允许 TLSv1.2:
<VirtualHost *:443>
SSLEngine On
SSLProtocol All -SSLv2 -SSLv3 -TLSv1
ServerName test.mysite.com
# bunch of other stuff omitted
</VirtualHost>
<VirtualHost 10.0.0.2:443>
SSLEngine On
SSLProtocol All -SSLv2 -SSLv3
ServerName test2.mysite.com
</VirtualHost>
<VirtualHost 10.0.0.3:443>
SSLEngine On
SSLProtocol TLSv1.2
ServerName test2.mysite.com
</VirtualHost>
答案3
如果您在 vhost 中使用服务器名称指示 (SNI),那么实际上您无法定义多个 SSL 版本。
但是,如果您使用的是专用服务器,您可能能够向服务器添加另一个 IP 地址。这样,您将能够为每个 IP 使用不同的 SSL 版本。您只需将您的 vhost 设置更改为预期的 IP:443。