此帖几乎复制了许多其他帖子,包括Rails 4 and Ruby 2 Net/HTTP SSL Request: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol和SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed,但有一个关键区别:“证书验证失败”错误仅在通过SSL代理进行代理时发生({{ 3}}),仅限于最新版本的Ruby。
具体来说,这个(非代理)代码有效:
uri = URI.parse('https://www.ibm.com')
http = Net::HTTP.new(uri.host, uri.port, nil)
http.use_ssl = true
http.start { |agent| agent.get(uri.path) }
并且此(代理)代码因“证书验证失败”错误而失败:
uri = URI.parse('https://www.ibm.com')
http = Net::HTTP.new(uri.host, uri.port, "localhost", 8888)
http.use_ssl = true
http.start { |agent| agent.get(uri.path) }
当通过当前版本的Ruby / OpenSSL中的代理时,仅出现错误。特别是:
curl -v https://www.ibm.com/
进行代理时没有错误,这使我认为Charles证书有效。所有这些让我怀疑是一个真正的Ruby bug而不是我的证书问题,但我很乐意以其他方式展示。
我正在观察这个环境的错误:
$ system_profiler SPSoftwareDataType | grep "System Version"
System Version: OS X 10.8.5 (12F45)
$ ruby --version ; openssl version ; gem list | grep http
ruby 2.0.0p247 (2013-06-27) [x86_64-darwin12.4.0]
OpenSSL 1.0.1e 11 Feb 2013
http-cookie (1.0.2)
http_router (0.10.2)
net-http-digest_auth (1.4)
net-http-persistent (2.9)
ntlm-http (0.1.1)
对于稍微旧版本的ruby / OpenSSL,该错误不会出现:
$ ruby --version ; openssl version ; gem list | grep http
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin10.8.0]
OpenSSL 0.9.8y 5 Feb 2013
http_router (0.11.0, 0.10.2)
httpauth (0.2.0)
net-http-digest_auth (1.2.1)
net-http-persistent (2.8)
ntlm-http (0.1.1)
答案 0 :(得分:1)
这里发生的事情是Charles无法为您提供“https://www.ibm.com”的有效证书,因为您设置Charles的任何证书(或者如果Charles创建自己的证书),它不能用于“ www.ibm.com“名称并由受信任的证书颁发机构认证。这就是如果客户端验证证书时连接失败的原因,并且如果您使用
跳过验证,则会起作用http.verify_mode = OpenSSL::SSL::VERIFY_NONE
它可能适用于旧版本的ruby,因为“net / https”已经过调整以验证 默认情况下,证书最近才出现。
答案 1 :(得分:0)
我似乎记得需要在ENV var中指出该证书。如果你真的不关心验证,那就更容易:
http.verify_mode = OpenSSL::SSL::VERIFY_NONE