Ruby:SSL_connect SYSCALL返回= 5 errno = 0状态=未知状态(OpenSSL :: SSL :: SSLError)

问题描述:

此错误的变体已发布到整个地方,但没有一个解决方案似乎适用于我。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的结果相匹配的结果。

这看起来像我在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:我改变了使用正确密码的答案。 –

我用机械化,和我一直在寻找一个补丁,而不是HTTP客户端实例的配置。这是我如何做到的:

OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers] += ':DES-CBC3-SHA'