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

我试图testing一个Poodle漏洞的修补程序,它涉及到在我的Web服务器上禁用SSLv3。 为了在非生产环境中首先对此进行testing,我将SSLProtocol设置为不同testing服务器的VirtualHost。 我的configuration看起来像这样:

<VirtualHost *:443> SSLEngine On SSLProtocol All -SSLv2 -SSLv3 ServerName test.mysite.com # bunch of other stuff omitted </VirtualHost> 

然而,即使重新启动Apache,我的testing网站仍然被宣称是脆弱的。 这是否预计工作? 我想知道是否必须在全局sslconfiguration中设置它,或者是否有其他细节导致设置无法使用和/或工作。

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

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

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

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

我遇到了Apache 2.4和modssl与OpenSSL 1.0.1k的这个问题,我期望Apache 2.2会受到同样的问题。

更新: OpenSSL bug在2016年10月13日被标记为已解决。但是,这是公开问题的集体closures的一部分,虽然提供了“部分修复”,但问题从未得到充分解决。

如果每个Vhost正在侦听不同的IP,您可以拥有不同的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> 

如果您正在使用服务器名称指示(SNI)与您的虚拟主机,实际上,您不能定义多个SSL版本。

但是,如果您使用的是专用服务器,则可能会向服务器添加另一个IP地址。 通过这种方式,您将能够使用每个IP不同的SSL版本。 您只需要按照预期的IP:443更改您的虚拟主机设置。

或者你可以使用:

SSLProtocol TLSv1 TLSv1.1 TLSv1.2

我在许多服务器上testing过,并为我工作! 你可以在这个网站上testing你的网站