Использование mechanize (или даже Net :: HTTP) с ruby ​​1.9 возвращает 'OpenSSL :: SSL :: SSLError' - как заставить SSLv3? - PullRequest
1 голос
/ 05 февраля 2012

Мне кажется, что за последние 2 дня я просматривал все доступные (google'able) посты об этой ошибке SSL в связи с Net::HTTP: OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A

Что я пытался сделатьво-первых, подключался к EtherPad серверу (https://test.titanpad.com), входил в систему и загружал zip-архив с помощью rubygems & mechanize; однако, к сожалению, я даже не дошел до этой точки из-за указанного SSL-Error. После попытки отладить проблему изнутри объекта механизации (например, путем установки в сценарии cert, ca_file, cert_store, verify_mode и т. Д.), Я поднялся на один уровень ближе к проблеме фактическая , пытаясьдля подключения к https://test.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, оказывается,Проблема в этом случае заключается в том, что использование SSLv3 должно быть принудительным для того, чтобы рукопожатие с Jetty 6.1.20 server позади titanpad.com работало:

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>

Теперь, хотя это очевидно работает при использовании Net::HTTP,нет такой опции, чтобы установить SSL версию для использования в Mechanize ... и поэтому я был бы очень рад, если бы кто-то мог указать мне на то, как я мог бы применять SSLv3 через указанныйgem oO

Еще раз спасибо!

Система: Mac OSX 10.6.8 ruby ​​1.9.3p0 (2011-10-30 ревизия 33570) [x86_64-darwin10] rubygems, установленные с Mechanize: имя_домена (0.5.2), механизировать (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), веб-роботы (0.0.13)

1 Ответ

2 голосов
/ 08 февраля 2012

Исправлено путем переноса функции ssl_version из Net :: HTTP (через net-http-persistent) в Mechanize v. 2.1.2 (см. https://github.com/tenderlove/mechanize/commit/4a228899855e0676ab69c2bf548170c8717465d8).

...