OpenSSL 握手失败

OpenSSL 握手失败

我们最近被迫将生产云服务器从 GoDaddy 迁移到 Azure,因为 GoDaddy 正在终止其云服务器服务。

我们的其中一台服务器是 CentOS 5.7,运行 JasperReports Bitnami 堆栈。在迁移过程中,我将所有服务器升级到最新发行版,并从 Ubuntu 12.04LTS 上的 Azure Bitnami Jasper 映像重建 Jasper

已在 JasperServer 上安装 SSL 证书并正常运行

所有新服务器都运行良好,现在问题就来了。

我们还在 GoDaddy 上拥有一个专用的 CentOS 5.8 虚拟服务器,该服务器目前驻留在那儿,该服务器上有一系列网站,可通过 Soap 提供来自 Jasper 的报告。

然而,尝试连接时握手失败

#openssl s_client -connect newjasperserver.com:443
CONNECTED(00000003)
9092:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:583:

和:

#openssl version
OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008

新的服务器正在运行:

#openssl version
OpenSSL 1.0.1c 10 May 2012

现在经过大量研究,似乎 OpenSSL < 0.9.8k 和 OpenSSL 1.0.1 之间存在不兼容性。

我确定的选项是:

  1. 将服务器迁移到 Azure 上的 CentOS 6.4 服务器(理想情况下,但政治上很困难,不要问为什么)

  2. 就地升级服务器(不支持,并且我不想在生产服务器上尝试)

  3. 清除服务器并使用 6.4 重建它(可能性很大,但如果我这样做,我会强制选择选项 1)

  4. 从服务器上删除 OpenSSL 并安装新版本(再次强调,在生产服务器上我不太习惯这样做)

  5. 安装 OpenSSL 的第二个实例(我的第二个选项,但我不确定如何继续)

  6. 安装 OpenSSL 的替代品(还没有开始研究这个)

  7. 禁用 Jasper 服务器上的强制加密并允许通过 http 连接(这看起来像是我最好的临时修复方法,直到我可以强制将该服务器迁移到 Azure)

我是否遗漏了某些选项?Jasper 端是否有办法允许来自旧版 OpenSSL 的连接?

答案1

您遇到的不兼容问题是:

RHEL5(及其衍生版本)上的 OpenSSL 版本根本没有宣传对 TLS 的支持。它仅支持 SSLv3 和 SSLv2。

RHEL6(及其衍生产品)上的 OpenSSL 版本支持 TLS 直至 TLSv1.2。它也支持 SSLv3,但它希望协商 TLS。

他们应该仍然能够协商会话,因为它们都有一个(小)公共密码列表,但根据您在服务器上选择的密码设置(例如,为了减轻 BEAST、消除低安全性密码等),客户端和服务器可能没有可用于通信的任何公共密码。

服务器的密码套件将设置<Connector ciphers=在 Tomcatserver.xml或 Apache 中(SSLCipherSuite如果将其置于 Apache 后面)。客户端将使用配置为使用的任何密码套件,否则使用其他密码套件DEFAULT

解决方案是检查服务器上的密码套件,例如,其中openssl ciphers -v STRINGSTRING 是您在服务器上配置的任何内容,然后在客户端上重复相同的操作,然后调整其中一个或两个,直到两者都有可用的密码套件并且两者都可以协商。

相关内容