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

我正在使用Authlogic-Connect进行第三方login。 运行适当的迁移后,Twitter /谷歌/雅虎login似乎工作正常,但Facebooklogin引发exception:

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' 

请build议..

当我尝试使用Rails 3的JQuery生成器时遇到了类似的问题

我解决了这个问题:

  1. 获取CURL证书颁发机构(CA)包。 你可以这样做:

    • sudo port install curl-ca-bundle [如果你使用MacPorts的话]
    • 或直接把它拉下来wget http://curl.haxx.se/ca/cacert.pem
  2. 执行试图validationSSLauthentication的ruby代码: SSL_CERT_FILE=/opt/local/etc/certs/cacert.pem rails generate jquery:install 。 在你的情况下,你想要把它设置为一个环境variables,在服务器select它的地方,或者在你的environment.rb文件中添加诸如ENV['SSL_CERT_FILE'] = /path/to/your/new/cacert.pem类的东西。

您也可以只安装CA文件(我没有尝试过)到操作系统 – 这里有很长的说明 – 这应该以类似的方式工作,但我没有亲自尝试过。

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

如果你在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来解决这个问题。 这是如何(用您的Ruby版本replace2.2.3 ):

 rvm reinstall 2.2.3 --disable-binary 

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

以下是如何在Windows上修复它: https : //gist.github.com/867550 (由Fletcher Nichol创build)

摘抄:

手动方式(钻孔)

http://curl.haxx.se/ca/cacert.pem下载;cacert.pem文件。 将这个文件保存到C:\RailsInstaller\cacert.pem

现在通过设置SSL_CERT_FILE让ruby知道你的证书权限包。 要在当前的命令提示符会话中设置,请键入:

 set SSL_CERT_FILE=C:\RailsInstaller\cacert.pem 

要使其成为永久设置,请将其添加到控制面板中 。

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

看看这个博客文章的解决scheme:“ Ruby 1.9和SSL错误 ”。

解决scheme是安装curl-ca-bundle端口,其中包含Firefox使用的相同根证书:

 sudo port install curl-ca-bundle 

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

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

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

问题是,ruby找不到可信的根证书。 截至1.9ruby检查这一点。 您将需要确保您的系统上有一个pem文件forms的curl证书。 您还需要确保证书位于Ruby预期的位置。 你可以得到这个证书在…

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

如果您的RVM和OSX用户,那么您的证书文件的位置将根据您使用的ruby的版本而有所不同。 使用:ca_path显式设置path是一个糟糕的想法,因为您的代码在生产时不可移植。 在那里你想提供一个默认位置的ruby证书(并假设你的开发人员知道他们在做什么)。 您可以使用dtruss来确定系统正在查找证书文件的位置。

在我的情况下,该系统正在寻找中的证书文件

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

不过MACOSX系统会期待一个证书

 /System/Library/OpenSSL/cert.pem 

我将下载的证书复制到这个path,它工作。 HTH

你在OSX上得到这个错误的原因是rvm安装的ruby。

如果你在OSX上遇到这个问题,你可以在这个博客文章中find一个非常广泛的解释:

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

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

执行此操作的命令是:

 rvm install 2.2.0 --disable-binary 

如果您已经有问题的版本,您可以重新安装它:

 rvm reinstall 2.2.0 --disable-binary 

(显然,根据需要replace你的ruby版本)。

新的authenticationgem旨在解决这个问题:

https://github.com/stevegraham/certified

在Mac OS X Lion上使用最新的macport:

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

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

请注意,自从Eric G于5月12日回答以来,证书文件的位置似乎已经发生了变化。

一个class轮在pipe理员提示符下为Windows修复它

choco install wget (首先参见chocolatey.org )

 wget http://curl.haxx.se/ca/cacert.pem -OC:\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] 

那么这为我工作

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

openssl实现我的Ubuntu 12.04有些问题

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

  1. gem' authentication '
  2. 捆绑安装

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

 $ 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 (或zsh的~/.zshrc )中join这一行:

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

然后更新你的terminal:

 $ source ~/.bash_profile 

这是另一个用于debugging的选项。

一定不要在任何生产环境中使用它,因为它首先会否定使用SSL的好处。 只有在你的本地开发环境中才能这样做。

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

虽然知道这是一个蹩脚的解决scheme,我仍然分享这个,因为它似乎很less有人回答这里使用Windows ,我认为一些Windows用户(包括我)会欣赏一个简单而直观的方法。

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

这告诉你的openssl在哪里寻找证书文件。 我的名字不是路易斯,但是我的名字是C:/Users/Luis/Code/luislavena/knap-build/var/knapsack/software/x86-windows/openssl/1.0.0l/ssl/cert.pem 。 path可能根据每个自己的环境而不同(例如openknapsack而不是luislavena )。

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

跛脚,这一定会起作用。

在处理Ruby项目时,我遇到了同样的问题。 我正在使用Windows 7 64位。

我解决了这个问题:

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

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

为我工作的最直接的答案是这样的

 sudo apt-get install openssl ca-certificates 

瞧!

与自制软件的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 

然后,正如这篇博文所示,

“ 如何治愈Net :: HTTP的危险默认HTTPS行为 ”

您可能需要安装always_verify_ssl_certificates gem,它允许您为ca_file设置默认值。

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

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

我遇到了这个问题,并build议修复rvm osx-ssl-certs update all都不工作,尽pipe我是OSX上的RVM用户。

这个修复工作对我来说是重新安装最新版本的openssl:

 brew update brew remove openssl brew install openssl 

OSX解决scheme:

安装最新的rvm稳定版本

 rvm get stable 

使用rvm命令自动解决证书

 rvm osx-ssl-certs update all 

我通过在terminal运行这个问题解决了这个问题。 全文可以在这里find

 rvm install 2.2.0 --disable-binary 

如果您在Leopard上遇到问题,那么我所做的就是如此。

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

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

然后把我在豹上find的证书换成了豹:

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

重新加载任何你有访问它,你应该是好的去!

只是因为说明对我来说有点不一样,所以我想我加了2美分:

我在OS X Lion上使用macports和rvm

我安装了curl-ca-bundle:

 sudo port install curl-ca-bundle 

然后我调整了我的omniauthconfiguration是这样的:

 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 

如果您在/ 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) 

我有一段时间的麻烦,正在黑客周围。 这个链接被certificate对我非常有帮助。 它帮助我在MAC OS X 9上成功升级SSL。

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

如果您正在本地运行您的rails应用程序,那么只需在application.rb的底部添加此行即可。

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

在此之后,您可以使用该应用程序没有任何问题。 你可以称它为黑客,但不build议。 仅在需要本地运行时使用

只需运行certified-update可执行文件,此命令将确保您的所有证书都是最新的。

这在我的Ruby on Rails应用程序中工作。

我不得不重新安装Ruby。 这应该解决它,如果你使用Ubuntu&rbenv:

 rbenv uninstall your_version # install dependencies sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev # install ruby with patch curl -fsSL https://gist.github.com/mislav/055441129184a1512bb5.txt | \ rbenv install --patch your_version 

欲了解更多信息,请查看关于此事的rbenv Wiki 。