使用Ruby 1.9.3时“证书validation失败”OpenSSL错误

我在Mac OS 10.6.8上使用Ruby 1.9.3p0(使用rvm安装)。 当我尝试使用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 
 return = 1 errno = 0 state = SSLv3读取服务器证书B:证书validation失败 
 (OpenSSL的:: SSL :: SSLError)

我理解Ruby语言解释器使用OpenSSL连接到GitHub来请求应用程序模板文件。 GitHub要求使用SSL进行所有连接。 连接失败,因为OpenSSL无法validation服务器证书。

我可以通过下载证书文件来解决问题:

  $ 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的“证书validation失败”问题? 这是一个Ruby 1.9.3错误吗? 它是否特定于Mac OS 10.6.8? 我的解决方案是解决这个问题的正确方法吗?

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

OpenSSL错误和Rails – 证书validation失败

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

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

我遇到了同样的问题,我已经针对OpenSSL的RVM安装编译了我的RVM Ruby。 我移动了原始海报下载的cacerts.pem文件〜/ .rvm / usr / ssl / cert.pem,以解决问题。

我遇到了同样的问题。

我最终修复它的方法是升级我通过MacPorts安装的OpenSSL版本。 我从2009年开始运行OpenSSL版本,所以我升级了我的MacPorts安装,然后通过ports命令行界面升级了我的OpenSSL安装,错误消失了。

在基于Mac的安装中,Ruby / Rails和OpenSSL之间必须有一些集成,这一点不言而喻。 在我的情况下,当Facebook将oAuth /登录令牌发送回我的应用程序时,我遇到了使用Facebook登录才能正常工作的问题,Devise&OmniAuth必须要求graph.facebook.com的有效SSL证书不在我的旧版OpenSSL。

Openssl认证目录是/usr/lib/ssl/在Debian中。 所以,以下三行对我来说已经够了,

 $ cd /usr/lib/ssl/ $ sudo curl -O http://curl.haxx.se/ca/cacert.pem $ sudo mv cacert.pem cert.pem 

这可能是因为你如何构建1.9.2和1.9.3 – 也许你用来构建每个配置的东西的工具略有不同。 或者他们可能使用不同版本的OpenSSL。

这是我可以发现的唯一可能相关的变化:Net:1.9.2和1.9.3之间的HTTP

  require 'net/protocol' -autoload :OpenSSL, 'openssl' require 'uri' +autoload :OpenSSL, 'openssl' 

(如果你想查看差异……)

 git clone https://github.com/ruby/ruby.git
 cd ruby
 git diff origin / ruby​​_1_9_2 origin / ruby​​_1_9_3  -  http.rb.

我有一个类似的问题,但不是在Rails上,而是在Ruby on Windows上。 我通过使用cacert.pem证书并将证书的位置设置为环境变量“SSL_CERT_FILE”来解决它

详细解答如下: https : //stackoverflow.com/a/35429863/4747587