SSL_connect返回= 1 errno = 0状态= SSLv3读取服务器证书B:证书验证失败


281

我正在使用Authlogic-Connect进行第三方登录。运行适当的迁移后,Twitter / Google / yahoo登录似乎可以正常工作,但是facebook登录抛出异常:

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

开发日志显示

OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed):
  app/controllers/users_controller.rb:37:in `update'

请建议..


2
这是否对您有帮助?stackoverflow.com/q/3977303/382818
Zabba 2010年

这是迄今为止我能找到的最佳解决方案stackoverflow.com/a/16983443/11792
Pavel Nikolov 2013年

Answers:


138

尝试将JQuery生成器用于Rails 3时遇到了类似的问题

我这样解决了:

  1. 获取CURL证书颁发机构(CA)捆绑包。您可以执行以下操作:

    • sudo port install curl-ca-bundle [如果您使用的是MacPorts]
    • 或直接将其拉下 wget http://curl.haxx.se/ca/cacert.pem
  2. 执行尝试验证SSL认证的红宝石代码:SSL_CERT_FILE=/opt/local/etc/certs/cacert.pem rails generate jquery:install。在您的情况下,您想将其设置为服务器将其拾取的环境变量,或者ENV['SSL_CERT_FILE'] = /path/to/your/new/cacert.pem在您的environment.rb文件中添加类似内容。

您也可以只将CA文件(我没有尝试过)安装到操作系统上(此处有很长的说明)这应该以类似的方式工作,但我个人没有尝试过。

基本上,您遇到的问题是某些Web服务正在使用针对OpenSSL无法验证的CA签名的证书进行响应。


1
尝试从ruby脚本使用Ruby Net :: IMAP连接到我的gmail帐户时,这也对我有用。
Jignesh Gohel 2012年

4
是的,这在ruby-1.9.3上工作正常。我将其添加到我的bash配置中。 export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cert.pem
andersjanmyr 2012年

5
我没有/ usr / local / etc / openssl,所以我跑 sudo curl http://curl.haxx.se/ca/cacert.pem >> /usr/local/etc/cacert.pemexport SSL_CERT_FILE=/usr/local/etc/cacert.pem
Lilith River

4
在Mac上进行开发时,我刚刚将其添加SSL_CERT_FILE=/usr/local/etc/openssl/cert.pem到应用程序的.env文件中,瞧-一切都很高兴。
戴夫萨格2013年

8
我感谢使用wget下载curl证书的讽刺意味。
Trey 2014年

135

如果在OS X上使用RVM,则可能需要运行以下命令:

rvm osx-ssl-certs update all

此处的更多信息:http : //rvm.io/support/fixing-broken-ssl-certificates

这是完整的解释:https : //github.com/wayneeseguin/rvm/blob/master/help/osx-ssl-certs.md


更新资料

在Ruby 2.2上,您可能必须从源代码重新安装Ruby才能解决此问题。方法如下(替换2.2.3为Ruby版本):

rvm reinstall 2.2.3 --disable-binary

感谢https://stackoverflow.com/a/32363597/4353Ian Connor


2
这是一个更全面的替代文章:railsapps.github.io/openssl-certificate-verify-failed.html
Peter P.

错误:rvm更新已被删除。请参阅“ rvm get”和“ rvm'rubygems” CLI API-2014
yang

@ user432506您是怎么得到该错误的?我正在使用最新的稳定RVM,它仍然可以工作。
htanata

4
这将工作一段时间,然后对我失败。对我有用的是运行,rvm reinstall 2.2.0 --disable-binary但随后您必须捆绑安装并重新开始。
伊恩·康纳

2
这是一个巨大的救星,应该是公认的答案。
Siraris's

129

这是在Windows上修复它的方法:https : //gist.github.com/867550(由Fletcher Nichol创建)

摘抄:

手动方式(无聊)

cacert.pemhttp://curl.haxx.se/ca/cacert.pem下载文件。将此文件保存到C:\RailsInstaller\cacert.pem

现在,通过设置使ruby知道您的证书颁发机构捆绑包SSL_CERT_FILE。要在当前命令提示符会话中进行设置,请输入:

set SSL_CERT_FILE=C:\RailsInstaller\cacert.pem

要将其设为永久设置,请在控制面板中添加此设置。


6
谢谢。这非常有用,也非常简单。
约翰

上面的解决方案对我没有帮助。这是Windows更好的指导:stackoverflow.com/questions/5720484/...
Sprachprofi

@Sprachprofi您链接到的解决方案一次仅适用于1个rails项目(因为您直接指向该证书)。我链接的要点(由Fletcher Nichol创建)将使它涵盖正在寻找证书的每个项目/宝石。
ryanjones 2012年

31

Ruby找不到任何可信任的根证书。

查看此博客文章中的解决方案:“ Ruby 1.9和SSL错误 ”。

解决方案是安装curl-ca-bundle包含Firefox使用的相同根证书的端口:

sudo port install curl-ca-bundle

并告诉您的https对象使用它:

https.ca_file = '/opt/local/share/curl/curl-ca-bundle.crt'

请注意,如果您希望代码在Ubuntu上运行,则需要ca_path使用默认证书位置设置属性/etc/ssl/certs


8
这似乎也发生在Windows上,在这种情况下,建议的解决方案将无法正常工作。
Bob Aman

24

在OSX上收到此错误的原因是安装了rvm的ruby。

如果您在OSX上遇到此问题,则可以在此博客文章中找到有关它的非常广泛的解释:

http://toadle.me/2015/04/16/fixing-failing-ssl-verification-with-rvm.html

简短的版本是,对于某些版本的Ruby,RVM下载预编译的二进制文件,这些二进制文件将在错误的位置查找证书。通过强制RVM下载源代码并在您自己的计算机上进行编译,可以确保证书位置的配置正确。

为此的命令是:

rvm install 2.2.0 --disable-binary

如果您已经有了该版本,则可以使用以下方法重新安装它:

rvm reinstall 2.2.0 --disable-binary

(显然,根据需要替换您的红宝石版本)。


这对我有用。您指向的博客文章也很有用,谢谢!
Cristian

2
这在El Capitan上对我有用。我内爆了rvm(内爆rvm)。再次安装\curl -sSL https://get.rvm.io | bash -s stable --autolibs=homebrew,然后rvm install <ruby-version> --disable-binary 我也这样做了,rvm get head因为这些都是一些前沿的问题。
rylanb

仅此解决方案对我有用,因为最初我在El Capitan上安装了Ruby 2.0.0,并且由于某种原因,即使使用right,旧版本也无法正常工作SSL_CERT_FILE。之后rvm install 2.2.0 --disable-binary,问题已解决。
laimison

20

问题在于,ruby无法找到要信任的根证书。从1.9开始,ruby对此进行了检查。您将需要确保您的系统上具有pem文件形式的curl证书。您还需要确保证书位于ruby期望的位置。您可以在以下位置获得此证书:

http://curl.haxx.se/ca/cacert.pem

如果您是RVM和OSX用户,那么您的证书文件位置将根据您使用的红宝石版本而有所不同。用:ca_path显式设置路径是一个坏主意,因为您的代码在投入生产时将无法移植。在那里,您想在默认位置为ruby提供证书(并假设您的开发人员知道他们在做什么)。您可以使用dtruss找出系统在哪里寻找证书文件。

在我的情况下,系统正在寻找cert文件

/Users/stewart.matheson/.rvm/usr/ssl/cert.pem

但是,MACOSX系统希望获得证书

/System/Library/OpenSSL/cert.pem

我将下载的证书复制到此路径,并且可以正常工作。高温超导


2
对我而言,在Ubuntu 12.04上,有效的证书路径为~/.rvm/usr/ssl/cert.pem
Nazar Hussain

您如何使用dtruss找出系统在哪里寻找证书?
pingu 2013年

@pingu根本不记得确切的命令,基本上,您运行druss并告诉它运行希望其“检查”的任何红宝石过程。它的输出非常冗长,但是基本上您将能够看到ruby进行的每个系统调用。调用之一将是读取文件调用,该文件指向一个不存在的文件。将证书移到此处或创建链接,您应该一切顺利。
斯图尔特

Ruby不应该cacert.pem在OS X上寻找。OS X不使用cacert.pem。系统和用户证书存储在KeyChain中。红宝石应与OS X的钥匙串被整合
JWW

做这个的最好方式是什么?你能举个例子吗?
斯图尔特

19

新认证的宝石旨在解决此问题:

https://github.com/stevegraham/certified


适用于ruby 2.0.0p481(2014-05-08)[i386-mingw32]
Evmorov 2014年

1
不适用于Rails 4.1.9,ruby-2.1.5。我将它添加到了Gemfile中bundle,明确地添加了它,require "certified"只是为了确保没有任何变化。我想念什么?
艾萨克·贝特什

Ruby不应该cacert.pem在OS X上寻找。OS X不使用cacert.pem。系统和用户证书存储在KeyChain中。Ruby应该与OS X上的KeyChain集成。OpenSSL 从未分发过cacert.pem。我尚不清楚为什么任何软件都会为此而采用OpenSSL。
jww

18

只需在您的gemfile中添加“ certified”的gem并运行bundle install。

  1. 宝石“ 认证
  2. 捆绑安装

确认这对El Capitan有所帮助。谢谢!
mcmlxxxiii '16

非常适合Rails和Debian :)非常感谢!
Szymon Rut

17

在具有最新macport的Mac OS X Lion上:

sudo port install curl-ca-bundle  
export SSL_CERT_FILE=/opt/local/share/curl/curl-ca-bundle.crt  

然后,重新运行失败的作业。

请注意,自5月12日Eric G回答以来,证书文件位置似乎已更改。


经过所有的搜索和大量尝试,这是解决问题的唯一方法。谢谢!
shawnwall

1
很酷,已经解决了。但只要安装OpenSSL与自制程序,你有一个添加export SSL_CERT_FILE=/usr/local/etc/openssl/cacert.pem到您的.profile或.bashrc文件
23tux

14

一个衬板可在管理员提示下修复Windows版

choco install wget(首先查看Chocolatey.org

wget http://curl.haxx.se/ca/cacert.pem -O C:\cacert.pem && setx /M SSL_CERT_FILE "C:\cacert.pem"

或者只是这样做:

gem sources -r https://rubygems.org/
gem sources -a http://rubygems.org/

Milanio的方法:

gem sources -r https://rubygems.org
gem sources -a http://rubygems.org 
gem update --system
gem sources -r http://rubygems.org
gem sources -a https://rubygems.org

gem install [NAME_OF_GEM]

1
小改进-您只需要更新ruby,然后可以添加回https源-这对我来说就像一个魅力:gem sources -r rubygems.org => gem sources -a rubygems.org => gem update --system =>宝石来源-r rubygems.org =>宝石来源-a rubygems.org =>宝石安装[NAME_OF_GEM]
milanio

13

嗯,这对我有用

rvm pkg install openssl
rvm reinstall 1.9.2 --with-openssl-dir=$rvm_path/usr

我的ubuntu 12.04的openssl实施出现问题


3
此作品,但我不得不这种表面处理: curl -O http://curl.haxx.se/ca/cacert.pemmv cacert.pem cert.pemmv cert.pem $rvm_path/usr/ssl
拉夫

为我工作,Mac OS X Yosemite。谢谢!
anevaude 2015年

12

虽然知道这是一个la脚的解决方案,但我仍在分享此信息,因为似乎很少有人在这里回答使用Windows的问题,而且我认为某些Windows用户(包括我在内)会喜欢一种简单直观的方法。

require 'openssl'
puts OpenSSL::X509::DEFAULT_CERT_FILE

这就告诉您的openssl在哪里寻找证书文件。我的名字不是路易斯,但我的名字是Luis C:/Users/Luis/Code/luislavena/knap-build/var/knapsack/software/x86-windows/openssl/1.0.0l/ssl/cert.pem。该路径可能会有所不同,具体取决于每个自己的环境(例如openknapsack而不是luislavena)。

即使set SSL_CERT_FILE=C:\foo\bar\baz\cert.pem通过控制台,路径也没有改变,所以...我 C:\Users\Luis\Code\luislavena\knap-build\var\knapsack\software\x86-windows\openssl\1.0.0l\ssl在本地磁盘中创建了目录,并在其中放置了一个cert文件。

尽管很me脚,这肯定会起作用。


2
辉煌。哈基,但这是唯一解决我问题的方法。
Daniel Magliola 2014年

调试的好方法...对我来说,用户是“ Justin”。谷歌搜索显示这似乎是RubyInstaller的已知问题。不幸的是,我自己创建该目录(+ pem文件)并没有为我解决问题
Wouter

12

我已经尝试安装curl-ca-bundle使用brew,但是包没有更多的可用:

$ brew install curl-ca-bundle
Error: No available formula for curl-ca-bundle 
Searching formulae...
Searching taps...

在Mac上对我有效的解决方案是:

 $ cd /usr/local/etc/openssl/certs/
 $ sudo curl -O http://curl.haxx.se/ca/cacert.pem

在您的~/.bash_profile(或~/.zshrczsh)中添加以下行:

export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem

然后更新您的终端:

$ source ~/.bash_profile

1
这对我有用-但路径错误。应该是:export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem
dnlmzw

2
由于其简单性,这是一个不错的解决方案。另外,通过引用中的已添加证书~/.bash_profile,它可以在需要进一步更新时提醒您添加了什么(关键是在哪里)。
auxbuss,2015年

这对我有用。@dnlmzw该路径对我来说很好,但是当然这取决于您的设置。谢谢!
theartofbeing,2016年

尝试向我的gem来源添加使用自签名证书的私有gem服务器URL时,对我不起作用。OSX 10.11.6 + rbenv
Sixty4bit

12

这是用于调试目的的另一个选项。

确保切勿在任何生产环境中使用此功能,因为它一开始会否定使用SSL的好处。仅在您的本地开发环境中执行此操作才有效。

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

26
Downvoted:是的,这可行,但是安装有效的CA捆绑包并实际解决问题的障碍是如此之低,以至于像这样的解决方案(几乎完全使SSL的安全性失效)不是您应该实施的解决方案。在证书颁发机构完全不可访问的环境中(即使那样,您也应该创建一个两个端点都可以访问的本地CA)。
yaauie 2012年

10
它几乎没有完全删除SSL保护,而是完全删除了它。永远不要这样做。
drbrain 2012年

15
对于调试而言,足够了
rickyduck 2012年

1
现在,这会产生一个警告在1.9
伊万

2
对于通过实际Internet进行的生产工作而言,这是一个糟糕的解决方案,但是,“您可能根本不使用SSL”并不是很正确。通过有线加密的流量比明文流量要好。是的,您有可能遭到中间人攻击,但是与单纯窃听明文流量经过时相比,这些攻击至少要站起来至少一个缺口。
Mark Reed

10

在进行Ruby项目时遇到同样的问题。我正在使用Windows 7 64位。

我通过以下方式解决了这个问题:

  1. http://curl.haxx.se/ca/cacert.pem下载cacert.pem文件。
  2. 将该文件保存到C:/RubyCertificates/cacert.pem
  3. 然后将我的环境变量“ SSL_CERT_FILE”设置为“ C:\ RubyCertificates \ cacert.pem”

来源:https : //gist.github.com/fnichol/867550


由于它是Windows,因此应在环境变量的值中使用后缀。
Christian Baumann

这是修复rubygems ssl错误后唯一为我解决“捆绑”问题的解决方案
DonBecker

7

对我有用的最直接的答案是

sudo apt-get install openssl ca-certificates

和瞧!


1
希望我可以多次投票,因为您为我节省了很多时间!
2014年

1
@Stephen-我希望你也可以:-)。它节省了我很多时间,所以我想把它发布在这里,这可能也会对其他人有所帮助。
Pratik Bothra 2014年

7

带有Homebrew的OS X 10.8.x:

brew install curl-ca-bundle
brew list curl-ca-bundle
cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem

1
同样适用于10.9。
Sami Samhuri 2013年

1
我可以使用OS X 10.9.1。太棒了!
rogeriopradoj 2013年

当您必须寻找随机的解决方案来解决这些愚蠢的问题时,某些东西会严重损坏。所有这些答案所做的事情完全不同,它们似乎都在某种程度上帮助了人们。WTF?
sergserg 2014年

13
卷曲-CA-束从酿造revmoved
Fa11enAngel


4

这对我有用。如果您使用rvm和brew:

rvm remove 1.9.3
brew install openssl
rvm install 1.9.3 --with-openssl-dir=`brew --prefix openssl`

4

我遇到了这个问题,rvm osx-ssl-certs update all尽管我是OSX上的RVM用户,但建议的修复程序没有起作用。

对我有用的修复是重新安装最新版本的openssl:

brew update
brew remove openssl
brew install openssl

4

我通过在终端中运行解决了这个问题。完整的文章可以在这里找到

rvm install 2.2.0 --disable-binary


3

如果您在本地运行Rails应用程序,则只需在application.rb底部添加此行。

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

之后,您可以使用该应用程序而不会出现任何问题。您可以称其为hack,但不建议这样做。仅在需要本地运行时使用


2

如果您在Leopard上遇到问题,这就是我的帮助。

我的证书很旧,需要更新。我下载了这个:

http://curl.haxx.se/ca/cacert.pem

然后替换了我在Leopard上找到的证书:

/usr/share/curl/curl-ca-bundle.crt

重新加载您正在访问的所有内容,您应该一切顺利!


2

只是因为说明对我有用的内容略有不同,所以我认为我要加2美分:

我在OS X Lion上并使用macports和rvm

我安装了curl-ca-bundle:

sudo port install curl-ca-bundle

然后,我将omniauth配置调整为:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, APP_CONFIG['CONSUMER_KEY'], APP_CONFIG['CONSUMER_SECRET'],
           :scope => 'https://www.google.com/m8/feeds https://www.googleapis.com/auth/userinfo.profile',
           :ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}
end

你可以(并且可能应该)放弃整个CA动物园(ca-bundle.crt),并使用谷歌互联网管理局G2:ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}。这是认证与Google的连接所需的唯一方法。
jww 2015年

2

如果/ usr / local / etc / openssl中有一个指向cert.pem的符号链接,请尝试执行以下操作:

ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE" (should be /usr/local/etc/openssl)
cd /usr/local/etc/openssl
wget http://curl.haxx.se/ca/cacert.pem
ln -s cacert.pem 77ee3751.0 (77ee3751.0 is my symbolic link, should depend on the openssl version)

2

对我有用的是答案的组合,即:

# Reinstall OpenSSL
brew update
brew remove openssl
brew install openssl
# Download CURL CA bundle
cd /usr/local/etc/openssl/certs
wget http://curl.haxx.se/ca/cacert.pem
/usr/local/opt/openssl/bin/c_rehash
# Reinstall Ruby from source
rvm reinstall 2.2.3 --disable-binary

1

我有几天的麻烦,正在四处乱逛。事实证明,该链接对我非常有帮助。它帮助我成功地在MAC OS X 9上升级了SSL。


1

有时 在MAC OSX中并非总是rvm问题,如果删除.rvm,问题仍然存在(尤其是从timemachine备份数据时),您可以尝试这种方式。

1.brew update
2.brew install openssl

1

添加gem 'certified', '~> 1.0'到我的Gemfile正常运行bundle解决了这个问题对我来说。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.