我们在使用 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。