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

cec*_*mel 9 ssl openssl tls

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

执行:

openssl s_client -connect ms.icometrix.com:443
Run Code Online (Sandbox Code Playgroud)

给出:

CONNECTED(00000003)
140557262718624:error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert
internal error:s23_clnt.c:770:
Run Code Online (Sandbox Code Playgroud)

执行时出现类似错误:

curl https://ms.icometrix.com
curl: (35) error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert
internal error
Run Code Online (Sandbox Code Playgroud)

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

OpenSSL 1.0.1f 6 Jan 2014
Run Code Online (Sandbox Code Playgroud)

从 dpkg -l openssl 输出 openssl:

1.0.1f-1ubuntu2
Run Code Online (Sandbox Code Playgroud)

有趣的是,当与其他版本的 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 提出的版本,但问题依然存在...

Ste*_*ich 4

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

openssl s_client -connect ms.icometrix.com:443 -cipher 'DEFAULT:!ECDH'
Run Code Online (Sandbox Code Playgroud)

我的猜测是,服务器在客户端提供的 25 条 ECC 曲线中的一些上出现问题。浏览器只提供很少的曲线。OpenSSL 0.9.8 尚不支持任何 ECC,并且 RedHat/CentOS 有因专利原因默认禁用 ECC 的历史。我不知道为什么 OpenSSL 1.0.2 可以工作,因为我无权访问该版本。

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