问题 Ruby:SSL_connect SYSCALL返回= 5 errno = 0 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版本。

你能告诉我导致这个问题究竟发生了什么变化吗?

更新:

斯蒂芬的回答和解释如下。供将来参考,以下是诊断此问题的方法。

  1. 首先确定服务器支持哪些密码。运行命令 nmap --script ssl-enum-ciphers ntpnow.com。找到列出支持的密码的部分。
  2. 确定您必须作为其中一部分传递的密钥 http.ciphers。跑 openssl ciphers。这将吐出一个 : 分隔的密码列表。找到与步骤1中的结果匹配的那个。

5106
2017-11-06 18:06


起源



答案:


这看起来像我回答的完全相同的问题 https://stackoverflow.com/a/29611892/3081018。同样的问题:服务器只能执行TLS 1.0,并且只支持DES-CBC3-SHA作为密码。在最近的ruby版本中,默认情况下不再启用此密码。要连接此密码,请尝试在代码中明确指定密码:

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

7
2017-11-07 05:33



优秀!这很有效。唯一的区别是我必须使用DES-CBC3-SHA作为密码。非常感谢你! - prajo
@prajo:我已经改变了使用正确密码的答案。 - Steffen Ullrich


答案:


这看起来像我回答的完全相同的问题 https://stackoverflow.com/a/29611892/3081018。同样的问题:服务器只能执行TLS 1.0,并且只支持DES-CBC3-SHA作为密码。在最近的ruby版本中,默认情况下不再启用此密码。要连接此密码,请尝试在代码中明确指定密码:

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

7
2017-11-07 05:33



优秀!这很有效。唯一的区别是我必须使用DES-CBC3-SHA作为密码。非常感谢你! - prajo
@prajo:我已经改变了使用正确密码的答案。 - Steffen Ullrich


我使用Mechanize,我正在寻找补丁而不是http客户端实例的配置。这就是我设法做到的方式:

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

3
2017-12-26 13:03