【问题标题】:OpenSSL::SSL::SSLError while making post request with Net::HTTP使用 Net::HTTP 发出发布请求时出现 OpenSSL::SSL::SSLError
【发布时间】:2015-01-28 10:26:29
【问题描述】:

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

我的代码如下所示:

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'

如果有人帮助我解决此错误,我将非常感激。

【问题讨论】:

  • 这个https://dev.ramble.com/v1/user/login是否使用由已知CA签署的证书?而这个 CA 证书在 usr/local/etc/openssl/cert.pem?
  • 谢谢@Grych,但确实如此
  • 您可以尝试使用相同的代码连接到另一台知名机器,例如google.com?如果有效,则意味着您主机上的证书有问题
  • 我无法联系dev.ramble.com(它可能仅在您的网络中可见)来检查证书,但在www.ramble.com 上,证书无效:“主机名不匹配”。仔细检查服务器上安装了哪个证书。

标签: ruby http openssl ssl-certificate net-http


【解决方案1】:

【讨论】:

    【解决方案2】:

    最后我现在通过更改ssl_version = :SSLv3 解决了这个问题。

    tl;博士

    浏览器/系统用来验证 SSL 的方法是普通的。它们只是预先配备了一组受信任的证书,这些证书是根据供应商预先筛选和信任的。对于 Mac OS X,您可以在证书/系统证书下的 Keychain 中查看这些内容。对于 Linux,它应该在 /etc/ssl/certs/ 附近。坦率地说,我不了解 Windows。但是这些应该在 Mac OS X 中的某个地方。您可能已经注意到,有很多;实际上太多而无法跟踪有效。但这就是它的工作原理!

    就 Ruby 而言,与系统/浏览器相比,小型到大型 Rub​​y 应用程序的需求始终是有限的。浏览器必须准备好导航到任何带有通过 HTTPS 或其他安全服务端点提供的公共证书的“合法”网站。但在典型的 Ruby 应用程序中,我们可能只需要连接一些使用 TLS 或需要证书验证的服务。因此,在浏览器/系统的情况下,预先捆绑了许多证书的 ruby​​ 几乎是徒劳的。那么红宝石是如何做到的呢?很简单,Ruby 手动完成!

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

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

    【讨论】:

    • 我是否将ssl_version = :SSLv3 添加到我的application.rb 文件中?
    【解决方案3】:

    我发现了另一个简单的解决方案。只需像这样使用自制软件安装openssl(如果您使用的是 Mac):

    brew install openssl
    

    【讨论】:

      猜你喜欢
      • 2014-05-29
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多