使用 Ruby 1.9.3 时出现“证书验证失败”OpenSSL 错误
Posted
技术标签:
【中文标题】使用 Ruby 1.9.3 时出现“证书验证失败”OpenSSL 错误【英文标题】:"Certificate verify failed" OpenSSL error when using Ruby 1.9.3 【发布时间】:2011-12-27 10:23:51 【问题描述】:我在 Mac OS 10.6.8 上使用 Ruby 1.9.3p0(使用 rvm 安装)。当我尝试使用application template hosted on GitHub 创建一个新的 Rails 应用程序时(例如):
$ rails new myapp -m https://github.com/RailsApps/rails3-application-templates/raw/master/rails3-mongoid-devise-template.rb -T -O我收到此错误消息:
/Users/me/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:799:in `connect': SSL_connect 返回=1 errno=0 状态=SSLv3 读取服务器证书 B:证书验证失败 (OpenSSL::SSL::SSLError)
我了解 Ruby 语言解释器正在使用 OpenSSL 连接到 GitHub 以请求应用程序模板文件。 GitHub 要求使用 SSL 进行所有连接。连接失败,因为 OpenSSL 无法验证服务器证书。
我能够通过下载证书文件解决问题:
$ cd /opt/local/etc/openssl $ sudo curl -O http://curl.haxx.se/ca/cacert.pem $ sudo mv cacert.pem cert.pem
我使用 Ruby 1.9.2 没有问题。为什么我遇到 Ruby 1.9.3 的“证书验证失败”问题?这是 Ruby 1.9.3 的错误吗?它特定于 Mac OS 10.6.8 吗?我的解决方案是解决此问题的正确方法吗?
【问题讨论】:
几个月前与另一个使用 net/http 的 gem 有过这个问题。以这种方式解决它: Koala.http_service.ca_path = "/etc/ssl/certs/" 所以您可能还需要在您的情况下添加您的 CA-Path。 丹尼尔 - 做同样的事情得到完全相同的错误!你是怎么解决的?尝试了上面的 3 行 - 不高兴。 嗨,鲍勃 - 很抱歉看到这个 bug 还在咬人。我没有要提供的解决方案,因为在如上所述更新我的证书后一切正常。它是系统特定的,因此很难诊断。可能是 rvm 问题。 看看我的回答***.com/a/16983443/11792 【参考方案1】:正确答案涉及很多活动部分。取决于您的操作系统、Ruby 版本、OpenSSL 版本、Rubygems 版本。我在研究之后写了一篇文章。我的文章解释了错误的原因,提供了进一步诊断的步骤,展示了几种解决方法,并提出了可能的解决方案。这会很有帮助:
OpenSSL Errors and Rails – Certificate Verify Failed
GitHub 上也有相关提交和问题的链接。
【讨论】:
如果您使用的是 Windows,请单击进入 Windows 解决方案,不要忘记设置 SSL_CERT 环境变量并关闭并重新打开终端。太好了,终于得到了解决方案!【参考方案2】:对我来说,这发生在 OS X 上,在更新到最新的 RVM (rvm 1.20.12) 并安装 ruby-1.9.3-p429 后使用 homebrew。我可以通过运行简单地重现该问题:
$ rvm use ruby-1.9.3-p429
$ irb
1.9.3p429 :001 > require 'open-uri'; open 'https://google.com'
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:800:in `connect'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:800:in `block in connect'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/timeout.rb:55:in `timeout'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/timeout.rb:100:in `timeout'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:800:in `connect'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:756:in `do_start'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:745:in `start'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:306:in `open_http'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:775:in `buffer_open'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:201:in `catch'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:677:in `open'
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:33:in `open'
from (irb):1
from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/bin/irb:16:in `<main>'1.9.3p429 :002 >
解决方案与问题中的类似,但路径错误。运行此修复它:
curl https://curl.haxx.se/ca/cacert.pem -o /usr/local/etc/openssl/cert.pem
关于正确路径的线索是,当我通过 RVM 安装 ruby-1.9.3-p429 时,输出中会显示:
Certificates in '/usr/local/etc/openssl/cert.pem' already are up to date.
我有 /usr/local/etc/openssl
路径,但该目录中没有 cert.pem
文件,所以我不确定为什么 RVM 声称证书是最新的。很高兴知道为什么我必须首先这样做,但我现在没有时间调查。
【讨论】:
curl http://curl.haxx.se/ca/cacert.pem -o /usr/local/etc/openssl/cert.pem
正是我所需要的。谢谢
请注意,这实际上是 RVM 的一个错误:github.com/wayneeseguin/rvm/issues/1920。从那以后它就被修复了。
非常感谢!我正在使用 Ruby 1.8.7-p370 并且必须运行这个:curl http://curl.haxx.se/ca/cacert.pem -o /etc/ssl/certs/ca-certificates.crt
来解决问题。你的小费很棒!【参考方案3】:
我遇到了同样的问题,我已经针对 OpenSSL 的 RVM 安装编译了我的 RVM Ruby。我将原始海报下载的 cacerts.pem 文件移动到 ~/.rvm/usr/ssl/cert.pem 下,以使问题消失。
【讨论】:
谢谢你,我尝试了所有的恶作剧,但你的提示解决了它! 这几乎对我有用,但我不得不将 cacerts.pem 文件放在/usr/local/etc/openssl/cert.pem
。这是我的问题和解决方案的详细信息:***.com/a/16741712/62
我没有 cert.pem,所以我在 ~/.rvm/usr/ssl 下创建了一个,并从 curl.haxx.se 复制和 cert.pem。不幸的是,我仍然遇到同样的法拉第问题:证书验证失败。我正在使用 Ruby 1.9.3 和 koala 1.6.0 版(但不确定这是否相关)。【参考方案4】:
我遇到了同样的问题。
我最终修复它的方法是升级我通过 MacPorts 安装的 OpenSSL 版本。我从 2009 年开始运行 OpenSSL 版本,所以我升级了我的 MacPorts 安装,然后通过ports
命令行界面升级了我的 OpenSSL 安装,错误消失了。
在基于 Mac 的安装上,Ruby/Rails 和 OpenSSL 之间必须有一些集成,这是不言而喻的。在我的情况下,当 Facebook 将 oAuth/Login 令牌发送回我的应用程序时,Login with Facebook 无法正常工作,Devise & OmniAuth 必须需要graph.facebook.com
的有效 SSL 证书这不在我的旧版 OpenSSL 中。
【讨论】:
谢谢!最好的办法可能是使用 rvm 安装新的 openssl 副本,如下所述:beginrescueend.com/packages/openssl.【参考方案5】:Openssl 认证目录是 Debian 中的/usr/lib/ssl/
。所以,对我来说,以下三行就足够了,
$ cd /usr/lib/ssl/
$ sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ sudo mv cacert.pem cert.pem
【讨论】:
【参考方案6】:这可能是因为您构建 1.9.2 和 1.9.3 的方式 - 可能是您用于构建每个配置的东西的工具略有不同。或者他们可能使用不同版本的 OpenSSL。
这是我能发现的与 Net:HTTP 在 1.9.2 和 1.9.3 之间唯一可能相关的变化
require 'net/protocol'
-autoload :OpenSSL, 'openssl'
require 'uri'
+autoload :OpenSSL, 'openssl'
(如果你想查看差异...)
git 克隆 https://github.com/ruby/ruby.git 光盘红宝石 git diff 起源/ruby_1_9_2 起源/ruby_1_9_3 -- http.rb【讨论】:
我使用 rvm 安装了 Ruby 1.9.2 和 1.9.3。【参考方案7】:我遇到了类似的问题,但不是在 Rails 上,而是在 Windows 上的 Ruby 上。我通过使用 cacert.pem 证书并将证书的位置设置为环境变量“SSL_CERT_FILE”
来解决它这里有详细答案:https://***.com/a/35429863/4747587
【讨论】:
以上是关于使用 Ruby 1.9.3 时出现“证书验证失败”OpenSSL 错误的主要内容,如果未能解决你的问题,请参考以下文章
Ruby 2.6.6 OpenSSL 1.1.1g - 证书验证失败(无法获取本地颁发者证书)
configure:error:C编译器在安装Ruby 1.9.3时无法创建可执行文件