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

时间:2015-01-28 10:26:30

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

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

我的代码如下所示:

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'

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

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

最后,我暂时更改ssl_version = :SSLv3来解决问题。

TL;博士

浏览器/系统验证SSL的方法很简单。他们只是预先配备了一组受信任的证书,这些证书是根据供应商预先筛选和信任的。对于MacOSx,您可以在证书/系统证书下查看Keychain中的那些。在linux的情况下,它应该在/ etc / ssl / certs /附近。坦率地说,我不了解窗户。但那些应该在像MacOSX那样的地方。你可能已经注意到,有很多;实际上太多了,无法跟踪有效。但无论如何它就是这样的!

至于ruby,与系统/浏览器相比,小型到大型ruby应用程序的要求始终是一个范围。浏览器必须准备好导航到任何合法的"通过https或其他安全服务端点提供公共证书的网站。但是在典型的Ruby应用程序中,我们可能只需要连接一些使用TLS的服务,否则需要进行证书验证。因此,与浏览器/系统一样的许多证书预先捆绑的ruby点大多数都是徒劳的。那么红宝石是怎么做到的?简单,Ruby手动完成!

修复程序的发现需要更长的时间,因为Yosemite带有过时的OpenSSL版本。再次添加复杂功能,您最喜欢的ruby版本管理器使用不同的OpenSSL版本编译ruby。这个mixmax给我们带来了很多困惑,显然也给rubyVM本身带来了混乱;)

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

答案 2 :(得分:0)

我找到了另一个简单的解决方案。只需使用这样的自制软件安装openssl(如果你是在mac上):

brew install openssl