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.

Ответ 3

Я получил одно и то же сообщение, и оказалось, что я установил http.use_ssl = true для подключения без SSL.

Ответ 4

Если вы находитесь на Mac и это проблема с сертификатом OSX (что было для меня), вы можете исправить это, запустив:

rvm osx-ssl-certs update all

См. https://rvm.io/support/fixing-broken-ssl-certificates