下面的代码产生以下错误: 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)
知道为什么吗?我尝试了所有其他问题中提到的所有内容,但仍然没有运气。
- Ruby 1.9.3p484(2013-11-22 修订版 43786)[x86_64-darwin13.3.0]
- OpenSSL 0.9.8y 2013 年 2 月 5 日
Update I
尝试了以下方法:
- Ruby 2.0.0p353(2013-11-22 修订版 43784)[x86_64-darwin13.3.0]
- OpenSSL 1.0.1i 2014 年 8 月 6 日
更新二
还是没有运气。
更新三
好吧,这是最终的代码 - 感谢 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,并且当客户端请求较小的内容(例如降级或发送 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 进行了测试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)