Назад | Перейти на главную страницу

Ошибка open-uri в Ruby: SSL_connect Возвращено SYSCALL = 5 errno = 0 state = SSLv2 / v3 сервер чтения привет A

Я замечаю ошибку подтверждения ssl, когда использую open-uri модуль ruby ​​в Debian: Squeeze, но он отлично работает в Debian: Wheezy и Debian: Jessie

Вот что я замечаю:

Debian Squeeze

root@0fdf024c8c42:/# cat /etc/issue
Debian GNU/Linux 6.0 \n \l

root@0fdf024c8c42:/# irb
irb(main):001:0> require 'open-uri'
=> true
irb(main):002:0> open("https://www.openssl.org")
OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A
    from /usr/lib/ruby/1.9.1/net/http.rb:799:in `connect'
    from /usr/lib/ruby/1.9.1/net/http.rb:799:in `block in connect'
    from /usr/lib/ruby/1.9.1/timeout.rb:54:in `timeout'
    from /usr/lib/ruby/1.9.1/timeout.rb:99:in `timeout'
    from /usr/lib/ruby/1.9.1/net/http.rb:799:in `connect'
    from /usr/lib/ruby/1.9.1/net/http.rb:755:in `do_start'
    from /usr/lib/ruby/1.9.1/net/http.rb:744:in `start'
    from /usr/lib/ruby/1.9.1/open-uri.rb:306:in `open_http'
    from /usr/lib/ruby/1.9.1/open-uri.rb:775:in `buffer_open'
    from /usr/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop'
    from /usr/lib/ruby/1.9.1/open-uri.rb:201:in `catch'
    from /usr/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop'
    from /usr/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri'
    from /usr/lib/ruby/1.9.1/open-uri.rb:677:in `open'
    from /usr/lib/ruby/1.9.1/open-uri.rb:33:in `open'
    from (irb):2
    from /usr/bin/irb:12:in `<main>'irb(main):003:0>

Debian Wheezy

root@d6d7e1af56d0:/# cat /etc/issue
Debian GNU/Linux 7 \n \l

root@d6d7e1af56d0:/# irb
irb(main):001:0> require 'open-uri'
=> true
irb(main):002:0> open("https://www.openssl.org")
=> #<StringIO:0x000000022aaec0>

Дебиан Джесси

root@405c251f32df:/# cat /etc/issue
Debian GNU/Linux 8 \n \l

root@405c251f32df:/# irb2.1
irb(main):001:0> require 'open-uri'
=> true
irb(main):002:0> open("https://www.openssl.org")
=> #<StringIO:0x00000001e45b78 @base_uri=#<URI::HTTPS:0x00000001e45ec0 URL:https://www.openssl.org>, @meta={"date"=>"Wed, 26 Aug 2015 11:56:57 GMT", "server"=>"Apache/2.4.7 (Ubuntu)", "strict-transport-security"=>"max-age=31536000; includeSubDomains", "accept-ranges"=>"bytes", "vary"=>"Accept-Encoding", "content-length"=>"2456", "content-type"=>"text/html; charset=UTF-8"}, @metas={"date"=>["Wed, 26 Aug 2015 11:56:57 GMT"], "server"=>["Apache/2.4.7 (Ubuntu)"], "strict-transport-security"=>["max-age=31536000; includeSubDomains"], "accept-ranges"=>["bytes"], "vary"=>["Accept-Encoding"], "content-length"=>["2456"], "content-type"=>["text/html; charset=UTF-8"]}, @status=["200", "OK"]>

Я знаю, что это не имеет ничего общего с рубиновой версией, потому что я пытался обновить рубиновую версию, но это не помогло.

Есть ли у машины Squeeze ca-certificates пакет установлен? Без этого не существует надежного набора корневых сертификатов, который можно использовать для проверки действительности представленного сертификата.

При условии, что ca-certificates установлен правильно, у вас могут возникнуть проблемы с совместимостью протокола TLS. Squeeze, будучи довольно старым, имеет версию OpenSSL, которая не совсем соответствует современным стандартам. Некоторые сайты, например www.openssl.org, который вы тестировали, могут настроить свой стек TLS таким образом, чтобы ограничить совместимость со старыми стеками TLS, такими как тот, который поставляется с squeeze.

В тестовой системе я получаю те же результаты, что и вы, когда пытаюсь open("https://www.openssl.org"), но подключение к другим сайтам работает отлично. Этот отчет ssllabs указывает на то, что www.openssl.org не поддерживает TLS 1.0, о чем сообщает соединение от Squeeze как наивысшую поддерживаемую версию. Итак, в данном конкретном случае у вас возникла проблема - простая несовместимость версий TLS.