openssl/curl 錯誤:SSL23_GET_SERVER_HELLO:tlsv1 警報內部錯誤

openssl/curl 錯誤:SSL23_GET_SERVER_HELLO:tlsv1 警報內部錯誤

從 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 。

相關內容