OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A

Posted

技术标签:

【中文标题】OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A【英文标题】: 【发布时间】:2014-11-06 23:34:39 【问题描述】:

以下代码产生以下错误:

require 'net/https'
uri = URI.parse("https://<server>.com")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.ssl_version = 'SSLv3'
http.get(uri.request_uri)

知道为什么吗?我尝试了所有其他问题中提到的所有内容,但仍然没有运气。

Ruby 1.9.3p484(2013-11-22 修订版 43786)[x86_64-darwin13.3.0] OpenSSL 0.9.8y 2013 年 2 月 5 日

更新我

尝试了以下方法:

Ruby 2.0.0p353(2013-11-22 修订版 43784)[x86_64-darwin13.3.0] OpenSSL 1.0.1i 2014 年 8 月 6 日

更新二

强制 ssl_version 为 :TLSv1_2

还是没有运气。

更新 III

好的,这是最终代码 - 感谢 Steffen(请参阅下面的答案):

require 'net/https'
uri = URI.parse("https://<server>.com")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.ssl_version = :TLSv1
http.ciphers = ['RC4-SHA']
http.get(uri.request_uri)

我怀疑我的问题与其他任何人有关,因为它与远程配置错误的服务器有关。

【问题讨论】:

它对我很有用:) 也在 /r/asknetsec reddit.com/r/AskNetsec/comments/64ulgg/… 一个原因可能只是网络断开。我花了 5 个小时才知道:| 对我有用的是减少线程数。 【参考方案1】:

这是服务器站点的问题。看起来服务器只接受 TLS 1.2,并且当客户端请求较少的内容(如降级或发送 SSL 警报)时不显示通常的行为,而是关闭连接。

OpenSSL 0.9.8 不支持 TLS 1.2,另外您的代码强制执行 SSLv3。仅当升级到 OpenSSL 1.0.1 时才能获得 TLS 1.2。

一些浏览器也将无法连接到该服务器,即使它们有办法解决这些损坏的服务器。但是,虽然 Firefox 只会尝试将连接降级到较低的 SSL 版本(这通常会有所帮助),但 Chrome 设法连接到 TLS 1.2。

编辑:我已经进一步分析了这个问题,现在我无法再与 TLS1.2 建立连接,但我可以与 TLS1.0 或 SSL3.0 建立连接,但前提是密码被硬编码为 RC4-沙。我尝试过 AES128-SHA 或 DES-CBC3-SHA 等其他方法,但它们不起作用。 因此,虽然它看起来像一个非常混乱的系统,但明确设置

http.ssl_version = 'TLSv1'       -- or SSLv3, but TLSv1 is better
http.ssl_cipher = 'rc4-sha'

应该可以。我不是 ruby​​ 用户,所以确切的语法可能会有所不同,但我已经使用 OpenSSL s_client 进行了测试。

【讨论】:

您好,感谢您的回复!根据您的反馈,我用更多信息更新了上述问题。 查看编辑 - 看起来你可以通过强制 RC4-SHA 作为密码来成功。 成功了!非常感谢你的帮助!这就是我所做的:http.ssl_version = :TLSv1http.ciphers = ['RC4-SHA']。再次感谢! 我把这个放在哪里? 我把这个放在哪里?使用 ruby​​2.5 和 openssl 1.0.2 版我也面临同样的问题【参考方案2】:

解决方案是升级到 openssl 1.0.2g-1​ubuntu4.6(从 1.0.1f-1​ubuntu2.21)(例如从 cedar-14 升级到 heroku-16 堆栈)。

heroku stack:set heroku-16 -a your-app

app.json:


  ...
  "stack": "heroku-16",
  ...

【讨论】:

现在我收到SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A 的频率降低了,但仍然会发生 我也有同样的问题【参考方案3】:

就我而言,问题在于 MTU 大小!

【讨论】:

你是怎么解决这个问题的?

以上是关于OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ruby on Rails 的 HTTP GET 请求:OpenSSL::SSL::SSLError

带有 fb_auth.exchange_token 的 OpenSSL::SSL::SSLError

OpenSSL::SSL::SSLError(主机名“smtp.mandrillapp.com”与服务器证书不匹配)

OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certif

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3/TLS write client hello

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certif