2015-11-06 143 views
11

此錯誤的變體已發佈到整個地方,但沒有一個解決方案似乎適用於我。Ruby:SSL_connect SYSCALL返回= 5 errno = 0狀態=未知狀態(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>' 

導航從瀏覽器的網站顯示的證書似乎是罰款。捲曲也不會產生任何錯誤。

此外,當我嘗試使用Ruby 1.9.3時,它似乎工作。不過,如果我能找到解決方案,我並不傾向於降級Ruby版本。

你能告訴我究竟是什麼導致了這個問題?

更新:

Steffen在下面的回答和解釋是正確的。爲了將來的參考,這裏是如何診斷這個問題。

  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作爲密碼。這個密碼在最近的ruby版本中不再默認啓用。要使用此密碼連接嘗試在代碼中明確指定的密碼:

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

非常好!這工作。唯一的區別是我必須使用DES-CBC3-SHA作爲密碼。非常感謝你! – prajo

+0

@prajo:我改變了使用正確密碼的答案。 –

3

我用機械化,和我一直在尋找一個補丁,而不是HTTP客戶端實例的配置。這是我如何做到的:

OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers] += ':DES-CBC3-SHA' 
相關問題