OpenSSL::SSL::SSLError 在使用 Net::HTTP 发出 post 请求时

OpenSSL::SSL::SSLError while making post request with Net::HTTP

我尝试了不同的方法(来自 google)来解决这个错误,但失败了。我无法解决这个问题。

我的代码如下所示:

require 'net/http'
require 'uri'
require 'json'

uri = URI.parse "https://dev.ramble.com/v1/user/login"
uri.user = "user1"
uri.password = "mypass"
connection = Net::HTTP::new uri.host, uri.port
connection.use_ssl = true
connection.ca_file = "/usr/local/etc/openssl/cert.pem"
connection.verify_mode=OpenSSL::SSL::VERIFY_PEER
session = connection.start

它引发了以下错误:

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
  from /Users/cmthakur/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/net/http.rb:920:in `connect'
  from /Users/cmthakur/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/net/http.rb:920:in `block in connect'
  from /Users/cmthakur/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/timeout.rb:76:in `timeout'
  from /Users/cmthakur/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/net/http.rb:920:in `connect'
  from /Users/cmthakur/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/net/http.rb:863:in `do_start'
  from /Users/cmthakur/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/net/http.rb:858:in `start'

如果有人帮我解决这个错误,我将不胜感激。

您可能会发现此 link(http://visibletrap.blogspot.com/2014/01/solved-different-cause-of-sslconnect.html) 有帮助

最后我通过暂时更改 ssl_version = :SSLv3 解决了问题。

tl;博士

browsers/system 用于验证 SSL 的方法很简单。它们只是预先配备了一组根据供应商预先筛选和信任的可信证书。在 Mac OS X 的情况下,您可以从 certificates/system 证书下的钥匙串中查看那些。如果是 Linux,它应该在 /etc/ssl/certs/ 附近。坦率地说,我不知道 Windows。但是那些应该在 Mac OS X 中的某处。正如您可能已经注意到的那样,有很多;实际上太多了,无法跟踪是有效的。但这就是它的工作原理!

至于 Ruby,与 system/browsers 相比,从小到大的 Ruby 应用程序的要求始终在范围内。浏览器必须准备好导航到任何带有 public 通过 HTTPS 或其他安全服务端点提供的证书的“合法”网站。但是在一个典型的 Ruby 应用程序中,我们可能只需要连接一些使用 TLS 的服务,否则就需要证书验证。因此,ruby 与许多证书预先捆绑在一起,就像 browser/system 的情况一样,这在很大程度上是徒劳的。那么ruby是怎么做到的呢?简单,Ruby手动完成!

修复的发现花费了更长的时间,因为 Yosemite 带有过时的 OpenSSL 版本。再次增加复杂性,您最喜欢的 Ruby 版本管理器使用不同的 OpenSSL 版本编译 Ruby。这种不匹配给我们带来了很多困惑,显然也给 RubyVM 本身带来了很多困惑;)

请阅读以下链接以了解技术细节:https://mislav.net/2013/07/ruby-openssl/

我发现了另一个简单的解决方案。像这样用自制软件安装 openssl(如果你在 mac 上):

brew install openssl