OpenSSL :: SSL :: SSLError:SSL_connect SYSCALL返回= 5 errno = 0 state = SSLv3读取服务器hello A

时间:2014-09-12 18:04:28

标签: ruby-on-rails ruby openssl net-http

下面的代码产生以下错误:OpenSSL :: SSL :: SSLError:SSL_connect SYSCALL返回= 5 errno = 0状态= SSLv3读取服务器hello A

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日

更新II

  • 强制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)

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

3 个答案:

答案 0 :(得分:32)

这是服务器站点的问题。看起来服务器专门接受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- SHA。我尝试过像AES128-SHA或DES-CBC3-SHA这样的人,但他们不能正常工作。 因此,虽然它看起来像一个真正混乱的系统明确设置

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

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

答案 1 :(得分:0)

解决方案是升级到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",
  ...
}

答案 2 :(得分:0)

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