2015-11-06 3 views
11

Варианты этой ошибки были опубликованы повсюду, но ни одно из решений, похоже, не работает для меня.Ruby: SSL_connect SYSCALL return = 5 errno = 0 state = unknown state (OpenSSL :: SSL :: SSLError)

Я бегу ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] и OpenSSL 1.0.1k 8 Jan 2015.

Запуск следующее:

require 'net/http' 
require 'openssl' 

url = 'https://ntpnow.com/' 
uri = URI.parse(url) 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.ssl_version = :TLSv1 
http.get(uri.path) 

свалок этого след:

/usr/local/lib/ruby/2.2.0/net/http.rb:923:in `connect': SSL_connect SYSCALL returned=5 errno=0 state=unknown state (OpenSSL::SSL::SSLError) 
    from /usr/local/lib/ruby/2.2.0/net/http.rb:923:in `block in connect' 
    from /usr/local/lib/ruby/2.2.0/timeout.rb:74:in `timeout' 
    from /usr/local/lib/ruby/2.2.0/net/http.rb:923:in `connect' 
    from /usr/local/lib/ruby/2.2.0/net/http.rb:863:in `do_start' 
    from /usr/local/lib/ruby/2.2.0/net/http.rb:852:in `start' 
    from /usr/local/lib/ruby/2.2.0/net/http.rb:1375:in `request' 
    from /usr/local/lib/ruby/2.2.0/net/http.rb:1133:in `get' 
    from bin/ntpnow_test.rb:9:in `<main>' 

Переход на сайт из браузера показывает сертификат, как представляется, будет хорошо. Curl также не вызывает ошибок.

Кроме того, когда я пытаюсь использовать Ruby 1.9.3, это работает. Однако я не склонен понижать версию Ruby, если найду решение.

Не могли бы вы рассказать мне, что именно изменилось, что вызывает эту проблему?

UPDATE:

ответ и объяснение ниже Штеффена правильно. Для справки в будущем, вот как диагностировать эту проблему.

  1. Сначала определите, какие шифры сервер поддерживает. Запустите команду nmap --script ssl-enum-ciphers ntpnow.com. Найдите раздел, в котором перечислены поддерживаемые шифры.
  2. Определите ключ шифрования, который вам нужно будет передать как часть http.ciphers. Запустить openssl ciphers. Это будет вызывать список шифров :. Найдите тот результат, который соответствует результату с шага 1.

ответ

7

Это похоже на ту же проблему, о которой я ответил в https://stackoverflow.com/a/29611892/3081018. Такая же проблема: сервер может выполнять только TLS 1.0 и поддерживает только DES-CBC3-SHA в качестве шифрования. Этот шифр больше не включен по умолчанию в последних рубиновых версиях. Для того, чтобы соединиться с этим шифром попытаться указать шифр явно в коде:

http.ssl_version = :TLSv1 
http.ciphers = ['DES-CBC3-SHA'] 
+0

Отлично! Это сработало. Единственное различие заключается в том, что мне пришлось использовать DES-CBC3-SHA в качестве шифрования. Большое спасибо! – prajo

+0

@prajo: Я изменил ответ, чтобы использовать правильный шифр. –

3

я использую Mechanize, и я искал патч вместо конфигурации экземпляра HTTP клиента. Вот так мне удалось это сделать:

OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers] += ':DES-CBC3-SHA' 
Смежные вопросы