
從 Ubuntu 14.04 開始,我們在使用 openssl 或 curl 連接到我們的一台伺服器時遇到了非常奇怪的問題
執行:
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 。