[英]OpenSSL::SSL::SSLError in Rails while raising HTTP REQUEST
[英]OpenSSL::SSL::SSLError while making post request with 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'
如果有人帮助我解决此错误,我将不胜感激。
最后,我现在通过更改ssl_version = :SSLv3
来解决问题。
tl;博士
浏览器/系统用来验证 SSL 的方法是简单的。 它们只是预先配备了一组根据供应商预先筛选和信任的可信证书。 在 Mac OS X 的情况下,您可以在证书/系统证书下从钥匙串查看那些。 在 Linux 的情况下,它应该在 /etc/ssl/certs/ 附近。 坦率地说,我不知道 Windows。 但是那些应该在某个地方,比如 Mac OS X。你可能已经注意到,有很多; 实际上太多了,无法跟踪有效。 但这就是它的工作原理!
至于 Ruby,与系统/浏览器相比,从小到大的 Ruby 应用程序的需求总是范围有限的。 浏览器必须准备好导航到任何带有通过 HTTPS 或其他安全服务端点提供的公共证书的“合法”网站。 但是在典型的 Ruby 应用程序中,我们可能只需要连接一些使用 TLS 或需要证书验证的服务。 因此,像浏览器/系统一样,ruby 与许多证书预先捆绑在一起的观点大多是徒劳的。 那么 ruby 是怎么做的呢? 很简单,Ruby 会手动完成!
由于 Yosemite 带有过时的 OpenSSL 版本,因此修复发现花费了更长的时间。 再次增加复杂性的是,您最喜欢的 Ruby 版本管理器使用不同的 OpenSSL 版本编译 Ruby。 这种不匹配给我们和 RubyVM 本身带来了很多困惑;)
请阅读以下技术细节链接: https : //mislav.net/2013/07/ruby-openssl/
我发现了另一个简单的解决方案。 只需像这样使用自制软件安装openssl
(如果您使用的是 mac):
brew install openssl
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.