我有一个运行Apache 2.2.22的mod_ssl和OpenSSL v1.0.1的Ubuntu 12.04.2 LTS服务器。
在我的虚拟主机configuration(其中所有其他行为像我所期望的),我有的SSLProtocol线与-all +SSLv3 。
有了这个configuration,TLS 1.1&1.2被启用并正常工作 – 这对我来说是非常直观的,因为我期望在给定configuration的情况下只能启用SSLv3。
我可以使用-/+TSLv1启用/禁用TLSv1,并且按预期工作。 但是+/-TLSv1.1和+/-TLSv1.2不是有效的configuration选项 – 所以我不能以这种方式禁用它们。
至于为什么我想要这样做 – 我正在处理一个第三方应用程序(我无法控制),有TLS启用的服务器有一些错误行为,我需要完全禁用它前进。
受这个bug的影响(是的,我已经能够重现)我已经看了最新的稳定版本的mod_ssl的源代码,并find了一个解释。 忍受着我,这会得到业余堆栈溢出:
当SSLProtocol被parsing时,会产生一个像这样的char :
0 1 0 0 ^ ^ ^ ^ | | | SSLv1 | | SSLv2 | SSLv3 TLSv1
在启动一个新的服务器上下文后,将启用所有可用的协议,并使用一些漂亮的按位“与”操作来检查上述char ,以确定应禁用哪些协议。 在这种情况下,如果SSLv3是唯一已明确启用的协议,则其他3个将被禁用。
OpenSSL支持TLSv1.1的协议设置,但由于SSLProtocol没有考虑这个选项,所以它永远不会被禁用。 OpenSSL v1.0.1在TLSv1.2中有一些已知的问题,但是如果支持的话,我想和TLSv1.1一样。 它不被mod_ssl识别/处理,因此从不禁用。
在pkg.sslmod/ssl_engine_config.c第925行中parsingpkg.sslmod/ssl_engine_config.c
上述函数中使用的选项在pkg.sslmod/mod_ssl.h中的第444行pkg.sslmod/mod_ssl.h
所有协议在pkg.sslmod/ssl_engine_init.c中的第586行被启用,之后在后续行上禁用特定的协议
你有几个select:
Protocols All,-TLSv1.1,-TLSv1.2 mod_ssl 😉 该问题也在mod_ssl Apache页面的注释中得到解决: http : //httpd.apache.org/docs/2.2/mod/mod_ssl.html#comment_1136
如果Ubuntu 12.04有Apache 2.2.23,问题就不会发生。 根据评论,可以启用TLSv1.1和TLSv1.2,但是也启用TLSv1.0:
SSLProtocol All -SSLv2 -SSLv3
首先,你必须确定哪一个是服务器端口443的默认虚拟主机(在Apache中,它是为该端口加载的第一个虚拟主机)。 如果您有一个configuration了所有虚拟主机的单个文件,那么默认的虚拟主机是您的列表中为端口443configuration的第一个虚拟主机。 如果您有两个或多个configuration了端口443的vhost的文件,则首先加载的文件是按字母顺序sorting的文件。
大多数用户在其服务器上都有一个ssl.conf文件,在那里configuration了默认的端口443虚拟主机。 根据上面的解释,它总是会在vhosts.conf之前加载。 所以,检查这是否是你的情况(几乎每个人的答案是“是”),并更改其中的协议 。 这就够了!
在这里发布了类似的问题: 如何禁用Apache中的TLS 1.1&1.2? 。 根据HBruijn:
除非拥有IP VirtualHosts,否则实际上首次出现的SSLProtocol指令的设置将用于整个服务器和/或所有基于名称的虚拟主机,这些虚拟主机支持TLS
而另一个在这里: 是否有可能在一个单一的VirtualHost(贵宾犬)在Apache中设置一个SSLProtocol? 。 根据vallismortis:
您只能为configuration文件中的第一个VirtualHost设置SSLProtocol。 所有后续的VirtualHost条目将从第一个条目inheritance该设置,并由于OpenSSL错误而默默地忽略自己的设置。
顺便说一下:对于一个给定的端口,服务器中默认的虚拟主机就是那个回应那个端口请求的服务器,它到达服务器时没有服务器名称标识或者错误的服务器名称。 例如:在浏览器地址栏中input的IP地址; 由不正确的DNS表导致的错误redirect。