openssl/curl 错误:SSL23_GET_SERVER_HELLO:tlsv1 警报内部错误

openssl/curl 错误:SSL23_GET_SERVER_HELLO:tlsv1 警报内部错误

我们在使用 OpenSSL 或 curl 连接到我们的一台服务器时遇到了非常奇怪的问题,使用的是 Ubuntu 14.04

正在执行:

openssl s_client -connect ms.icometrix.com:443

给出:

CONNECTED(00000003)
140557262718624:error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert
internal error:s23_clnt.c:770:

执行的时候出现类似的错误:

curl https://ms.icometrix.com
curl: (35) error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert
internal error

openssl 版本的输出(在客户端/服务器上):

OpenSSL 1.0.1f 6 Jan 2014

dpkg -l openssl 的 openssl 输出:

1.0.1f-1ubuntu2

有趣的是,当连接其他版本的 Openssl 时,问题消失了:

  • 从 Mac 开始,OpenSSL 0.9.8zd 2015 年 1 月 8 日,一切正常
  • 来自 centos,OpenSSL 1.0.1e-fips 2013 年 2 月 11 日,一切正常
  • Ubuntu 14.04 上的最新稳定版本,OpenSSL 1.0.2d 2015 年 7 月 9 日,一切正常。

从服务器端看,我们没有发现任何异常。问题始于我们在机器上禁用 SSL3。

apt-get 的构建可能有问题吗?

我们还测试了其他版本,即 apt-cache showpkg 提出的版本,但问题仍然存在......

答案1

这看起来像是客户端和服务器之间 ECDH 支持的问题。如果排除所有 ECDH 密码,它就可以正常工作:

openssl s_client -connect ms.icometrix.com:443 -cipher 'DEFAULT:!ECDH'

我猜想服务器在客户端提供的 25 条 ECC 曲线中有些会失效。浏览器只提供少数曲线。OpenSSL 0.9.8 尚不支持任何 ECC,而 RedHat/CentOS 曾因专利原因默认禁用 ECC。我不知道 OpenSSL 1.0.2 为何能正常工作,因为我无法访问此版本。

请注意,提供 OpenSSL 版本通常是不够的,因为所有发行版都保留旧版本,但添加了安全补丁。请检查dpkg -l openssl我的系统上提供的版本为 1.0.1f-1ubuntu2.15。

相关内容