使用 Ruby 1.9.3 时出现“证书验证失败”OpenSSL 错误

问题描述 投票:0回答:8

我在 Mac OS 10.6.8 上使用 Ruby 1.9.3p0(使用 rvm 安装)。当我尝试使用托管在 GitHub 上的应用程序模板创建新的 Rails 应用程序时,使用以下内容(例如):

$ Rails 新 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:在`connect'中:SSL_connect
返回=1 errno=0 状态=SSLv3 读取服务器证书 B:证书验证失败
(OpenSSL::SSL::SSL 错误)

我了解 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 吗?我的解决方案是解决这个问题的正确方法吗?

ruby-on-rails ruby ruby-on-rails-3.1 openssl rvm
8个回答
21
投票

正确答案涉及很多活动部分。取决于您的操作系统、Ruby 版本、OpenSSL 版本、Rubygems 版本。经过研究,我最终写了一篇文章。我的文章解释了错误的原因,提供了进一步诊断的步骤,展示了几种解决方法,并提出了可能的解决方案。这会很有帮助:

OpenSSL 错误和 Rails – 证书验证失败

GitHub 上还有相关提交和问题的链接。


13
投票

对我来说,在更新到最新的 RVM (rvm 1.20.12) 然后安装 ruby-1.9.3-p429 后,在使用自制软件的 OS X 上发生了这种情况。我只需运行即可重现该问题:

$ 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 声称证书是最新的。很高兴知道为什么我必须首先这样做,但我现在没有时间调查。


11
投票

我遇到了同样的问题,针对 OpenSSL 的 RVM 安装编译了我的 RVM Ruby。我将原始海报下载的 cacerts.pem 文件移至 ~/.rvm/usr/ssl/cert.pem 下,以使问题消失。


2
投票

我也遇到了同样的问题。

我最终解决这个问题的方法是升级通过 MacPorts 安装的 OpenSSL 版本。我运行的是 2009 年的 OpenSSL 版本,因此我升级了 MacPorts 安装,然后通过

ports
命令行界面升级了 OpenSSL 安装,错误消失了。

在基于 Mac 的安装上,Ruby/Rails 和 OpenSSL 之间必定存在某种集成,这是不言而喻的。就我而言,当 Facebook 将 oAuth/登录令牌发送回我的应用程序时,我无法让 Login with Facebook 正常工作,Devise 和 OmniAuth 必须需要

graph.facebook.com
的有效 SSL 证书,而该证书不在我的旧版本 OpenSSL。


1
投票

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

0
投票

这可能是因为你构建 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
红宝石CD
git diff origin/ruby_1_9_2 origin/ruby_1_9_3 -- http.rb

0
投票

我也遇到了类似的问题,但不是在 Rails 上,而是在 Windows 上的 Ruby 上。我通过使用 cacert.pem 证书并将证书的位置设置为环境变量“SSL_CERT_FILE”

解决了这个问题

详细答案在这里:https://stackoverflow.com/a/35429863/4747587


0
投票

您可以尝试如下更新 CA 证书(对我有用):

对于Linux用户(在下面运行):

apt-get update ca-certificates
yum update ca-certificates

如果您使用 RVM,请运行以下命令:

rvm osx-ssl-certs update all

对于Mac用户(在下面运行):

brew upgrade ca-certificates
rvm osx-ssl-certs update all

如果您不使用RVM,请参考(来源):https://www.engineyard.com/blog/ruby-ssl-error-certificate-verify-failed/#:~:text=If%20this%20verification% 20%2C%20你失败了,%20问题%20,有%20%20证书

© www.soinside.com 2019 - 2024. All rights reserved.