情况:我有一个 RHEL 7 虚拟机,并且在其上安装了 ActiveMQ (v5.16.0)(在 /opt/... 中)
几天以来,我的一些客户无法再使用显然是 TLS 1.0 协议的 openwire SSL 端口 (61617) 进行连接。
错误信息是:
Could not accept connection from tcp://10.10.170.1:45762: Client requested protocol TLSv1 is not enabled or supported in server context (Client requested protocol TLSv1 is not enabled or supported in server context)
当我使用以下命令从服务器本身测试端口时:
openssl s_client -connect localhost:61617 -tls1
openssl s_client -connect localhost:61617 -tls1_1
openssl s_client -connect localhost:61617 -tls1_2
...前两个命令不显示 SSL 证书,但第三个命令工作正常。
我的问题是:
由于我们没有更改 ActiveMQ 配置中的任何内容,我想知道 RHEL 上是否在内核级别传递了一些安全补丁?我可以在哪里检查服务器是否有这种情况?
在 ActiveMQ 方面,我们没有更改任何有关 SSL 的内容,并且我们的 AMQ 传输配置从未定义过 Transport.tls:
<transportConnector name="openwire+ssl" uri="ssl://0.0.0.0:61617?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
请注意,相同的 ActiveMQ 配置仍然在我们的生产服务器上运行,这让我认为在操作系统级别已经做了一些事情。
我不知道在哪里发布这个问题:unix.SE、serverFault 或这里;如果您认为它更依赖于另一个站点,请随意迁移它。我将这个问题集中在 RHEL 上,但它也可以帮助其他人了解其他操作系统。
答案1
由于 ActiveMQ 是客户端连接的服务,因此 ActiveMQ 明确规定可以为 SSL/TLS 连接启用哪些协议。更改 Transport.tls 文件并添加以下内容。
<transportConnector name="openwire+ssl" uri="ssl://0.0.0.0:61617?transport.enabledProtocols=TLSv1,TLSv1.1,TLSv1.2&maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
这也将启用所有被削弱的协议。请记住,TLS 1.0 和 TLS 1.1 不被认为是安全的,不应谨慎使用
答案2
看来最近的 openjdk 更新(在我们的例子中从 1.8.282 到 1.8.292)默认禁用了 TLSv1.0 和 TLSv1.1。
该更改记录在下一张票。
票证摘录说:
禁用 TLS 1.0 和 1.1
解决方案
将“TLSv1”和“TLSv1.1”添加到 java.security 配置文件中的 jdk.tls.disabledAlgorithms 安全属性中。
您还可以看到RedHat 的发行说明
在章节3.1.4.禁用 TLS 1.0 和 1.1 版本
TLS 协议的 TLS 1.0 和 1.1 版本不再被认为是安全的,并被更安全和现代的 TLS 1.2 和 1.3 版本取代。 TLS 1.0 和 1.1 版本现在默认处于禁用状态。如果遇到问题,您可以通过从 java.security 配置文件中的 jdk.tls.disabledAlgorithms 安全属性中删除 TLSv1 或 TLSv1.1 来重新启用版本(风险自负)。
这解释了为什么我们的 ActiveMQ 突然停止为仍在使用已弃用协议的客户端工作。最佳实践是迁移这些客户端,而不是重新启用最弱的协议。
“有趣”的是,服务(ActiveMQ)仍然使用最新的 JDK,直到您重新启动 ActiveMQ,因此修补日期可能与客户端开始出现问题的日期不同。
答案3
您可以使用命令测试服务器上是否禁用了特定的 TLS curl
,例如
curl -vI --tls-max 1.0 https://example.org/
curl -vI --tls-max 1.1 https://example.org/
当 TLS 被禁用时,它应该产生如下错误:
卷曲:(35)LibreSSL / 3.3.6:错误:1404B42E:SSL例程:ST_CONNECT:tlsv1警报协议版本
有关的:命令提示符检查主机所需的 TLS 版本。