![如何在 Apache 中禁用 TLS 1.1 和 1.2?](https://linux22.com/image/612893/%E5%A6%82%E4%BD%95%E5%9C%A8%20Apache%20%E4%B8%AD%E7%A6%81%E7%94%A8%20TLS%201.1%20%E5%92%8C%201.2%EF%BC%9F.png)
我有一台 Ubuntu 12.04.2 LTS 服务器,运行带有 mod_ssl 和 OpenSSL v1.0.1 的 Apache 2.2.22。
在我的 vhosts 配置中(其中的其他所有内容都按照我预期的方式运行),我有SSLProtocol
一行-all +SSLv3
。
通过这样的配置,TLS 1.1 和 1.2 已启用并正常工作 - 这对我来说是违反直觉的,因为我期望仅有的在该配置下,SSLv3 将被启用。
我可以使用 轻松启用/禁用 TLSv1 -/+TSLv1
,并且一切如预期。但+/-TLSv1.1
和+/-TLSv1.2
不是有效的配置选项 - 因此我无法通过这种方式禁用它们。
至于我为什么要这样做 - 我正在处理第三方应用程序(我无法控制),它在启用 TLS 的服务器上存在一些错误行为,我需要完全禁用它才能继续前进。
答案1
我对这个错误很感兴趣(是的,我能够重现它),我查看了最新稳定版本的源代码mod_ssl
并找到了解释。请耐心等待,这会变得像业余堆栈溢出一样:
当SSLProtocol
解析完成后,结果看起来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 无法识别/处理它,因此永远不会被禁用。
源代码mod_ssl 的参考资料:
SSLProtocol
在第 925 行进行解析,pkg.sslmod/ssl_engine_config.c
上述函数中使用的选项在第 444 行定义,pkg.sslmod/mod_ssl.h
所有协议在第 586 行启用,pkg.sslmod/ssl_engine_init.c
随后特定协议在后续行中被禁用
那么如何禁用它呢?
您有以下几种选择:
- 使用以下命令在 OpenSSL 配置文件中禁用它:
Protocols All,-TLSv1.1,-TLSv1.2
- 重写
mod_ssl
;-)
答案2
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
答案3
首先,你必须确定什么是端口 443 的默认虚拟主机在您的服务器(Apache 加载的第一个 SSL 虚拟主机)中,并编辑其配置文件。大多数用户都有一个ssl.conf在他们的服务器中创建一个文件,并在其中配置端口 443 的虚拟主机。由于此文件的名称以“s”开头,因此它将在 vhosts.conf 中配置的虚拟主机(以“v”开头)之前加载。因此,请检查这是否是您的情况(对于几乎所有人来说答案都是“是”),然后更改该文件中的协议。够了!
此处发布了类似的问题:如何在 Apache 中禁用 TLS 1.1 和 1.2?据 HBruijn 所述:
除非您有 IP VirtualHosts,否则实际上 SSLProtocol 指令第一次出现的设置将用于整个服务器和/或所有支持 TLS 的基于名称的 VirtualHosts
还有一个:是否可以在 Apache 中为单个 VirtualHost(poodle)设置 SSLProtocol?据 vallismortis 所述:
您只能为配置文件中的第一个 VirtualHost 设置 SSLProtocol。由于 OpenSSL 错误,所有后续 VirtualHost 条目都将从第一个条目继承该设置,并默认忽略其自己的设置。
顺便说一句:对于给定端口,服务器中的默认虚拟主机是响应该端口请求的主机,这些请求到达服务器时没有服务器名称标识(或服务器名称错误)。例如:在浏览器地址栏中输入的 IP 或由不正确的 DNS 表导致的错误重定向。
答案4
SLLProtocol 设置似乎不起作用。我测试了它强制使用仅 TLS v1.2 的 Python 客户端,即使你像这样配置虚拟主机
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
服务器将始终提供 TLSv1.2
但是还有一种替代方法是使用 SSLOpenSSLConfCmd 来指示 apache2 如何执行 openssl。您需要在 /etc/apache2/mods-enabled/ssl.conf 和虚拟主机配置文件(/etc/apache2/sites-enabled/ 目录中的文件)中配置以下几行:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLOpenSSLConfCmd Protocol "-ALL, TLSv1.3"
第一个禁用旧协议,第二个强制 openssl 命令仅使用 TLSv1.3。