下面的代码产生以下错误:OpenSSL::SSL::SSLError:SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server 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)

知道为什么吗?我try 了所有其他问题中提到的一切,但仍然没有成功.

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

Update I

try 了以下操作:

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

Update II

  • 强制ssl_版本为:TLSv1_2

还是不走运.

Update 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)

因为我的远程问题与其他任何人都有关系.

推荐答案

这是服务器站点的一个问题.服务器似乎只接受TLS 1.2,当客户端请求较小的内容(如降级或发送SSLalert )时,服务器不会显示通常的行为,而是关闭连接.

OpenSSL 0.9.8不支持TLS 1.2,此外,您的代码还强制执行SSLv3.只有在升级到OpenSSL 1.0.1时,才能获得TLS 1.2.

一些浏览器也将无法连接到这台服务器,即使他们有办法处理这些坏掉的服务器.但是,虽然Firefox只会try 将连接降级到较低的SSL版本(这通常会有所帮助),但Chrome设法与TLS1.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_客户端进行了测试.

Ruby-on-rails相关问答推荐

Rails 7.1中的覆盖脚手架控制器

Data-turbo-stream=&FALSE&QOOT;不适用于带有方法POST的表单

Rails 7,返回具有两个单独条件的活动记录关联,一个在父级,一个在子级

多对多模型通过控制台创建记录不起作用

API Rails 路由,令牌是路由的一部分

Ruby Sinatra Web 服务在 localhost:4567 上运行,但不在 IP 上

Devise + Omniauth - 如何传递额外的参数?

向现有控制器添加操作(Ruby on Rails)

注册表单上是否需要 CSRF 保护?

价格字段的字符串、小数或浮点数据类型?

默认情况下,如何在 Rails 中使 cookie 安全(仅限 https)?

使用 ActiveRecord 3 / Arel 查找单个记录的最佳方法?

删除链接在 Rails 3 视图中发送Get而不是Delete

在 ruby​​ on rails 上构建方法

在 Controller 中调用模型方法

控制器 helper_method

从任何编码强制字符串为 UTF-8

在任何来源中都找不到 thread_safe-0.3.0

如何在 Rails 3 中订购包含的元素

为什么 Mac OS X 带有 ruby​​/rails?