1

過去 2 日間、以下に関連するこの SSL エラーに関する入手可能な (Google 対応の) 投稿をすべて確認したと思いますNet::HTTPOpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A

最初に試したのは、EtherPadサーバー (https://test.titanpad.com) に接続し、サインインして、rubygems と mechanize を使用して zip アーカイブをダウンロードすることでした。しかし、残念ながら、私は言ったためにその点にさえ達していませんSSL-Error. mechanize オブジェクト内から問題をデバッグしようとした後 (スクリプトで cert、ca_file、cert_store、verify_mode などを手動で設定して fe)、https://testに接続しようとして、実際の問題に 1 レベル近づきました。 .titanpad.comを使用するだけでNet::HTTP:

(この例では、最初にhttps://encrypted.google.comに接続して、うまくいくSSL はずです。EtherPad サーバーへの接続試行は 6 行目から始まります)

irb(main):001:0> require 'net/https'
=> true
irb(main):002:0> google = Net::HTTP.new('encrypted.google.com', 443)
=> #<Net::HTTP encrypted.google.com:443 open=false>
irb(main):003:0> google.use_ssl = true
=> true
irb(main):004:0> google.ca_file = '/opt/local/share/curl/curl-ca-bundle.crt' if File.exists?('/opt/local/share/curl/curl-ca-bundle.crt')
=> "/opt/local/share/curl/curl-ca-bundle.crt"
irb(main):005:0> google.request_get('/')
=> #<Net::HTTPOK 200 OK readbody=true>

irb(main):006:0> etherpad = Net::HTTP.new('test.titanpad.com', 443)
=> #<Net::HTTP test.titanpad.com:443 open=false>
irb(main):007:0> etherpad.use_ssl = true
=> true
irb(main):008:0> etherpad.ca_file = '/opt/local/share/curl/curl-ca-bundle.crt' if File.exists?('/opt/local/share/curl/curl-ca-bundle.crt')
=> "/opt/local/share/curl/curl-ca-bundle.crt"
irb(main):009:0> etherpad.request_get('/')
OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:799:in `connect'
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:799:in `block in connect'
    from /opt/local/lib/ruby1.9/1.9.1/timeout.rb:54:in `timeout'
    from /opt/local/lib/ruby1.9/1.9.1/timeout.rb:99:in `timeout'
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:799:in `connect'
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:755:in `do_start'
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:744:in `start'
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:1284:in `request'
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:1195:in `request_get'
    from (irb):9
    from /opt/local/bin/irb:12:in `<main>'

verify_mode を使用している場合でもOpenSSL::SSL::VERIFY_NONE、OpenSSL は次のように回避します。

irb(main):010:0> etherpad.verify_mode = OpenSSL::SSL::VERIFY_NONE
=> 0
irb(main):011:0> etherpad.request_get('/')
OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:799:in `connect'
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:799:in `block in connect'
    from /opt/local/lib/ruby1.9/1.9.1/timeout.rb:54:in `timeout'
    from /opt/local/lib/ruby1.9/1.9.1/timeout.rb:99:in `timeout'
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:799:in `connect'
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:755:in `do_start'
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:744:in `start'
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:1284:in `request'
    from /opt/local/lib/ruby1.9/1.9.1/net/http.rb:1195:in `request_get'
    from (irb):11
    from /opt/local/bin/irb:12:in `<main>'

openssl 自体をさらにいじってみると、この場合の本当の問題は、Jetty 6.1.20 server背後の titanpad.comとのハンドシェイクを機能させるために SSLv3 の使用を強制する必要があることがわかりました。

irb(main):001:0> require 'net/https'
=> true
irb(main):002:0> etherpad = Net::HTTP.new('test.titanpad.com', 443)
=> #<Net::HTTP test.titanpad.com:443 open=false>
irb(main):003:0> etherpad.use_ssl = true
=> true
irb(main):004:0> etherpad.ssl_version = "SSLv3"
=> "SSLv3"
irb(main):005:0> etherpad.ca_file = '/opt/local/share/curl/curl-ca-bundle.crt' if File.exists?('/opt/local/share/curl/curl-ca-bundle.crt')
=> "/opt/local/share/curl/curl-ca-bundle.crt"
irb(main):006:0> etherpad.request_get('/')
=> #<Net::HTTPFound 302 Found readbody=true>

を使用するとこれは明らかに機能しますが、 Mechanizeで使用するバージョンをNet::HTTP設定するオプションはありません。 oOSSL

再度、感謝します!

システム: Mac OSX 10.6.8 ruby​​ 1.9.3p0 (2011-10-30 リビジョン 33570) [x86_64-darwin10] mechanize でインストールされた ruby​​gems: domain_name (0.5.2)、mechanize (2.1.1)、net-http-digest_auth ( 1.2)、net-http-persistent (2.4.1)、nokogiri (1.5.0)、ntlm-http (0.1.1)、unf (0.0.4)、unf_ext (0.0.4)、webrobots (0.0.13)

4

1 に答える 1

2

ssl_version 機能を Net::HTTP (net-http-persistent 経由) から Mechanize v. 2.1.2 に移植することで修正されました ( https://github.com/tenderlove/mechanize/commit/4a228899855e0676ab69c2bf548170c8717465d8を参照)。

于 2012-02-07T23:35:16.130 に答える