是否可以在 Apache 中为单个 VirtualHost(贵宾犬)设置 SSLProtocol?

Cor*_*ory 13 ssl virtualhost apache-2.2 apache-2.4

我正在尝试针对涉及在我的 Web 服务器上禁用 SSLv3的贵宾犬漏洞测试补丁。为了首先在非生产环境中进行测试,我在 VirtualHost 上为不同的测试服务器设置 SSLProtocol。我的配置看起来像这样:

<VirtualHost *:443>
    SSLEngine On
    SSLProtocol All -SSLv2 -SSLv3
    ServerName test.mysite.com
    # bunch of other stuff omitted
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

然而,即使在重新启动 apache 之后,我的测试站点仍然声称易受攻击。这是预期的工作吗?我想知道我是否必须在全局 ssl 配置中设置它,或者是否有其他微妙的东西导致设置不采用和/或工作。

val*_*tis 17

您只能为配置文件中的第一个 VirtualHost 设置 SSLProtocol。所有后续的 VirtualHost 条目将从第一个条目继承该设置,并由于OpenSSL 错误而默默地忽略它们自己的设置。

mod_ssl有相应的错误报告,但正如错误报告中所述,该问题需要在 OpenSSL 中解决(证书是继承的,协议不是继承的)。

必须为每个 VirtualHost 独立设置密码套件,否则您最终会得到默认列表,包括许多不安全的密码。另外,请注意,不支持服务器名称指示 (SNI) 的旧客户端将始终使用默认主机(除非使用 被阻止SSLStrictSNIVHostCheck),这可能会混淆您的测试。

简而言之,您应该能够为每个虚拟主机指定自定义密码套件和证书,但在修复错误之前,不要期望每个虚拟主机的自定义协议都有正确的行为。

我在使用 Apache 2.4 和使用 OpenSSL 1.0.1k 的 modssl 时遇到了这个问题,我希望 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 建立的,因此默认主机必须包含任何虚拟主机支持的所有协议。

此补丁在 init_vhost 函数中添加了额外的 APR_EMISMATCH 返回状态,以便使用 OpenSSL 注册的 ssl_callback_ServerNameIndication 回调可以返回致命警报 SSL_AD_PROTOCOL_VERSION。这旨在对 ClientHello 产生与指定不包含相关版本的 SSLProtocol 相同的响应。因为在处理 ClientHello 期间和产生响应之前调用 SNI 回调,所以它似乎正是这样做的。

如果您突然看到以下格式的消息:

Rejecting version [version] for servername [hostname]
Run Code Online (Sandbox Code Playgroud)

然后你应该仔细检查你SSLProtocol的默认主机。


小智 5

如果每个 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>
Run Code Online (Sandbox Code Playgroud)