web-dev-qa-db-ja.com

OpenSSL :: SSL :: SSLError:SSL_connect SYSCALL戻り値= 5 errno = 0 state = SSLv3 read server hello A

次のコードは、次のエラーを生成します。OpenSSL :: SSL :: SSLError:SSL_connect SYSCALL戻り値= 5 errno = 0 state = SSLv3 read server hello A

require 'net/https'
uri = URI.parse("https://<server>.com")
http = Net::HTTP.new(uri.Host, uri.port)
http.use_ssl = true
http.ssl_version = 'SSLv3'
http.get(uri.request_uri)

理由は何ですか?私は他のすべての質問に記載されているすべてを試しましたが、まだ運はありません。

  • Ruby 1.9.3p484(2013-11-22リビジョン43786)[x86_64-darwin13.3.0]
  • OpenSSL 0.9.8y 2013年2月5日

更新I

以下を試しました:

  • Ruby 2.0.0p353(2013-11-22リビジョン43784)[x86_64-darwin13.3.0]
  • OpenSSL 1.0.1i 6 Aug 2014

アップデートII

  • Ssl_versionを:TLSv1_2に強制しました

まだ運がありません。

アップデートIII

さて、ここに最終的なコードがあります-Steffenに感謝します(以下の回答を参照):

require 'net/https'
uri = URI.parse("https://<server>.com")
http = Net::HTTP.new(uri.Host, uri.port)
http.use_ssl = true
http.ssl_version = :TLSv1
http.ciphers = ['RC4-SHA']
http.get(uri.request_uri)

私の質問は、リモートの誤って構成されたサーバーに関連していたため、他の誰にも関連があるとは思いません。

32
Hesham

これはサーバーサイトの問題です。サーバーがTLS 1.2を排他的に受け入れているように見え、クライアントがより小さなもの(ダウングレードやSSLアラートの送信など)を要求したときに通常の動作を示さず、代わりに接続を閉じます。

TLS 1.2はOpenSSL 0.9.8でサポートされておらず、さらにコードでSSLv3を実施しています。 TLS 1.2は、OpenSSL 1.0.1にアップグレードする場合にのみ取得できます。

一部のブラウザは、このような破損したサーバーを回避する方法があったとしても、このサーバーへの接続に失敗します。ただし、Firefoxは接続を下位のSSLバージョンにダウングレードしようとしますが(これは多くの場合に役立ちます)ChromeはTLS 1.2との接続を管理します。

編集:問題をさらに分析し、TLS1.2との接続を取得できなくなりましたが、TLS1.0またはSSL3.0との接続は取得できますが、暗号がRC4-SHAにハードコードされている場合のみです。 AES128-SHAやDES-CBC3-SHAのような他のものを試しましたが、動作しません。だから、それは本当に混乱したシステムが明示的に設定されているように見えますが

http.ssl_version = 'TLSv1'       -- or SSLv3, but TLSv1 is better
http.ssl_cipher = 'rc4-sha'

動作するはずです。私はRubyユーザーではないので、正確な構文は異なるかもしれませんが、OpenSSL s_clientでテストしました。

32
Steffen Ullrich

解決策は、openssl 1.0.2g-1​ubuntu4.61.0.1f-1​ubuntu2.21から)(例:cedar-14からheroku-16スタック)にアップグレードすることです。

heroku stack:set heroku-16 -a your-app

そしてapp.jsonで:

{
  ...
  "stack": "heroku-16",
  ...
}
0
Dorian