Я замечаю ошибку подтверждения 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.