web-dev-qa-db-ja.com

Ruby:SSL_connect SYSCALL returned = 5 errno = 0 state = unknown state(OpenSSL :: SSL :: SSLError)

このエラーのバリアントはあちこちに投稿されていますが、解決策はどれも私にはうまくいかないようです。

Ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]OpenSSL 1.0.1k 8 Jan 2015を実行しています。

以下を実行します:

require 'net/http'
require 'openssl'

url = 'https://ntpnow.com/'
uri   = URI.parse(url)
http = Net::HTTP.new(uri.Host, uri.port)
http.use_ssl = true
http.ssl_version = :TLSv1
http.get(uri.path)

このトレースをダンプします。

/usr/local/lib/Ruby/2.2.0/net/http.rb:923:in `connect': SSL_connect SYSCALL returned=5 errno=0 state=unknown state (OpenSSL::SSL::SSLError)
    from /usr/local/lib/Ruby/2.2.0/net/http.rb:923:in `block in connect'
    from /usr/local/lib/Ruby/2.2.0/timeout.rb:74:in `timeout'
    from /usr/local/lib/Ruby/2.2.0/net/http.rb:923:in `connect'
    from /usr/local/lib/Ruby/2.2.0/net/http.rb:863:in `do_start'
    from /usr/local/lib/Ruby/2.2.0/net/http.rb:852:in `start'
    from /usr/local/lib/Ruby/2.2.0/net/http.rb:1375:in `request'
    from /usr/local/lib/Ruby/2.2.0/net/http.rb:1133:in `get'
    from bin/ntpnow_test.rb:9:in `<main>'

ブラウザからサイトに移動すると、証明書が問題ないように見えます。また、Curlはエラーを生成しません。

さらに、Ruby 1.9.3で試したところ、うまくいくようです。しかし、解決策が見つかれば、Rubyバージョンをダウングレードする傾向はありません。 。

この問題を引き起こしている正確な変更点を教えていただけますか?

更新:

ステフェンの答えと以下の説明は正しいです。今後の参考のために、この問題を診断する方法を次に示します。

  1. 最初に、サーバーがサポートする暗号を決定します。コマンドnmap --script ssl-enum-ciphers ntpnow.comを実行します。サポートされる暗号をリストするセクションを見つけます。
  2. http.ciphersの一部として渡す必要がある暗号キーを決定します。 openssl ciphersを実行します。これにより、:で区切られた暗号のリストが出力されます。手順1の結果に一致するものを見つけます。
13
prajo

これは、私が回答したのとまったく同じ問題 https://stackoverflow.com/a/29611892/3081018 のように見えます。同じ問題:サーバーはTLS 1.0のみを実行でき、DES-CBC3-SHAのみを暗号としてサポートします。最近のRubyバージョンでは、この暗号はデフォルトで有効になっていません。この暗号に接続するには、コードで明示的に暗号を指定してください:

http.ssl_version = :TLSv1
http.ciphers = ['DES-CBC3-SHA']
8
Steffen Ullrich

Mechanizeを使用していて、httpクライアントインスタンスの構成の代わりにパッチを探していました。これは私がどうにかしてどうにかしたものです:

OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers] += ':DES-CBC3-SHA'
3
barbolo