openssl/curl エラー: SSL23_GET_SERVER_HELLO:tlsv1 アラート内部エラー

openssl/curl エラー: SSL23_GET_SERVER_HELLO:tlsv1 アラート内部エラー

Ubuntu 14.04からopensslまたはcurlを使用してサーバーの1つに接続する際に、非常に奇妙な問題が発生します。

実行中:

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 が返されるかどうかを確認してください。

関連情報