OpenSSL:: SSL:: SSLError: SSL_connect возвращен = 1 errno = 0 состояние = неизвестно состояние: неизвестный протокол
Я следил за многими сообщениями, касающимися этой проблемы, и не помогло им.
Я пытаюсь подключиться с помощью самых простых команд irb:
require 'open-uri'
open ('https://aristo4stu3.bgu.ac.il')
Странно, что для любого другого https uri, который я пробовал, он работал нормально (т.е. https://google.com).
В целях отладки я даже пытался отключить проверку SSL, используя:
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
который, похоже, тоже не помог.
Моя настройка (на AWS):
$ rvm -v
rvm 1.21.3 (stable) by Wayne E. Seguin <[email protected]>, Michal Papis <[email protected]> [https://rvm.io/]
$ ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 13.04
Release: 13.04
Codename: raring
Завершить журнал:
2.0.0-p247 :001 > require 'open-uri'
=> true
2.0.0-p247 :002 > open('https://aristo4stu3.bgu.ac.il')
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=unknown state: (null)
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:918:in `connect'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:918:in `block in connect'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/timeout.rb:52:in `timeout'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:918:in `connect'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:862:in `do_start'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:851:in `start'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:313:in `open_http'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:708:in `buffer_open'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:210:in `block in open_loop'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:208:in `catch'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:208:in `open_loop'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:149:in `open_uri'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:688:in `open'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:34:in `open'
from (irb):2
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p247/bin/irb:16:in `<main>'
Ответы
Ответ 1
Проблема заключается в том, что ваш целевой сайт aristo4stu3.bgu.ac.il
является разборчивым в отношении установления связи SSL/TLS. Я получил два разных результата со следующей командой OpenSSL с разными версиями OpenSSL:
openssl s_client -connect aristo4stu3.bgu.ac.il:443
Это связано с запасом OpenSSL 0.9.8x на OS X 10.7.5. Тем не менее, он подключается не с помощью OpenSSL 1.0.1e - в этом случае сервер просто закрывает соединение (отправив уведомление Close Notify) сразу после получения Client Hello.
Я захватил пакеты с Wireshark, и разница между отправкой этих двух версий заключается в том, что 0.9.8x отправляет поддержку SSLv2 Client Hello через TLS 1.0, в то время как 1.0.1e отправляет поддержку TLSv1 Client Hello через TLS 1.2.
Если я скажу 1.0.1e не использовать TLS:
openssl s_client -connect aristo4stu3.bgu.ac.il:443 -no_tls1
Это успешно связывается с поддержкой SSLv3 Client Hello через SSL 3.0.
Кстати, мой локальный ruby делает успешную связь с open-uri
на вашем сайте:
$ irb
>> require 'open-uri'
=> true
>> open('https://aristo4stu3.bgu.ac.il')
=> #<StringIO:0x10271fa90>
>> require 'openssl'
=> false
>> OpenSSL::OPENSSL_VERSION
=> "OpenSSL 0.9.8r 8 Feb 2011"
>>
Таким образом, указанные подходы выглядят следующим образом:
- Обновите сервер, чтобы обрабатывать дополнительные варианты Hello, или
- Установите ruby, который использует более старую библиотеку OpenSSL, или
- Измените свою программу для отправки другого клиента Hello.
Не похоже, что модуль open-uri
имеет возможность установить версию SSL/TLS, используемую для связи. Если вы не можете изменить сервер, вам может понадобиться использовать другой модуль или библиотеку для установления соединения или, возможно, найти способ исправления модуля openssl
, чтобы он использовал другой клиентский Hello.
Ответ 2
Я нашел хорошую запись проблемы и решения здесь. http://blog.55minutes.com/2012/05/tls-error-with-ruby-client-and-tomcat-server/
Фрагмент кода TL;DR, который решает проблему.
http = Net::HTTP.new(host, port)
http.use_ssl = true
http.ssl_version = :SSLv3
http.start { ... }
Ответ 3
Я получил одно и то же сообщение, и оказалось, что я установил http.use_ssl = true
для подключения без SSL.
Ответ 4
Если вы находитесь на Mac и это проблема с сертификатом OSX (что было для меня), вы можете исправить это, запустив:
rvm osx-ssl-certs update all
См. https://rvm.io/support/fixing-broken-ssl-certificates