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

时间:2010-12-24 19:49:31

标签: ruby-on-rails ruby ssl authlogic facebook-graph-api

我正在使用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'

请建议..

37 个答案:

答案 0 :(得分:135)

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

我解决了这个问题:

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

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

  3. 您也可以只将CA文件(我没有尝试过)安装到操作系统 - 有冗长的说明here - 这应该以类似的方式工作,但我没有亲自尝试过

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

答案 1 :(得分:134)

如果您在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版本替换2.2.3):

rvm reinstall 2.2.3 --disable-binary

归功于https://stackoverflow.com/a/32363597/4353Ian Connor

答案 2 :(得分:129)

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

摘录:

  

手动方式(无聊)

     

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
     

要将此设置为永久设置,请在control panel

中添加此设置

答案 3 :(得分:31)

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

请查看此博客文章以获取解决方案:“Ruby 1.9 and the SSL error”。

  

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

sudo port install curl-ca-bundle
     

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

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

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

答案 4 :(得分: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

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

答案 5 :(得分:20)

问题是ruby无法找到要信任的根证书。截至1.9红宝石检查这个。您需要确保以pem文件的形式在系统上拥有卷曲证书。您还需要确保证书位于ruby期望的位置。您可以在......

获得此证书
http://curl.haxx.se/ca/cacert.pem

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

在我的情况下,系统正在

中寻找证书文件
/Users/stewart.matheson/.rvm/usr/ssl/cert.pem

然而,MACOSX系统会期望

中的证书
/System/Library/OpenSSL/cert.pem

我将下载的证书复制到此路径并且有效。 HTH

答案 6 :(得分:19)

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

https://github.com/stevegraham/certified

答案 7 :(得分:18)

只需在gemfile中添加gem'languified'并运行bundle install。

  1. gem'认证'
  2. 捆绑安装

答案 8 :(得分:17)

在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日回答以来,证书文件位置似乎已经发生了变化。

答案 9 :(得分: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]

答案 10 :(得分:13)

这对我有用

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

我的ubuntu 12.04的openssl实现有问题

答案 11 :(得分:12)

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

请确保永远不要在任何生产环境中使用它,因为它会否定首先使用SSL的好处。只在本地开发环境中执行此操作才有效。

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

答案 12 :(得分:12)

我尝试使用127.0.0.1 admin.domain.com 127.0.0.1 login.domain.com 127.0.0.1 www.domain.com 安装curl-ca-bundle,但该软件包不再可用:

brew

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

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

$ cd /usr/local/etc/openssl/certs/ $ sudo curl -O http://curl.haxx.se/ca/cacert.pem (或~/.bash_profile for zsh)中添加此行:

~/.zshrc

然后更新您的终端:

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

答案 13 :(得分:12)

虽然知道这是一个非常蹩脚的解决方案,但我仍然分享这个,因为似乎很少有人在这里回答使用 Windows ,我认为一些Windows用户(包括我在内)会很感激简单直观的方法。

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

告诉你的openssl在哪里查找cert文件。我的名字不是路易斯,但我的名字是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并将一个证书文件放入它。

Lame原样,这肯定会奏效。

答案 14 :(得分:10)

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

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

  1. http://curl.haxx.se/ca/cacert.pem下载 cacert.pem 文件。
  2. 将该文件保存到 C:/RubyCertificates/cacert.pem
  3. 然后设置我的环境变量" SSL_CERT_FILE" to" C:\ RubyCertificates \ cacert.pem"
  4. 来源:https://gist.github.com/fnichol/867550

答案 15 :(得分:7)

OS X 10.8.x with Homebrew:

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

答案 16 :(得分:7)

对我来说最直接的答案就是这个

sudo apt-get install openssl ca-certificates

瞧!!!“

答案 17 :(得分:4)

我遇到了这个问题,尽管我是OSX上的RVM用户,但rvm osx-ssl-certs update all的建议修复无效。

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

brew update
brew remove openssl
brew install openssl

答案 18 :(得分:4)

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

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

答案 19 :(得分:4)

我通过在终端中运行此问题来解决此问题。完整写入可在here

上获得
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)

答案 20 :(得分:4)

然后,正如这篇博文所暗示的那样,

How to Cure Net::HTTP’s Risky Default HTTPS Behavior

您可能希望安装always_verify_ssl_certificates gem,以便为ca_file设置默认值。

答案 21 :(得分:3)

OSX解决方案:

安装最新的rvm稳定版

rvm get stable

使用rvm命令自动解决证书

rvm osx-ssl-certs update all

答案 22 :(得分:3)

如果您在本地运行rails应用程序,则只需在application.rb。

的底部添加此行
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

在此之后,您可以毫无问题地使用该应用程序。你可以称之为黑客,但不建议这样做。仅在需要本地运行时使用

答案 23 :(得分: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

答案 24 :(得分: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)

答案 25 :(得分: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

答案 26 :(得分:2)

如果你特意在Leopard上遇到问题,那么这就是我所做的。

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

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

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

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

重新加载你正在访问它的任何东西,你应该好好去!

答案 27 :(得分:1)

使用Ruby 2.3.4遇到此问题:

我解决了卸载OpenSSL并重新安装它的问题。我跑了:

brew uninstall --ignore-dependencies openssl

然后

brew install openssl

它完成了这项工作。

答案 28 :(得分:1)

最新的rubygem-update-2.6.7解决了这个问题。 http://guides.rubygems.org/ssl-certificate-update/

答案 29 :(得分:1)

我不得不重新安装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

答案 30 :(得分:1)

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

这适用于Windows中的Ruby on Rails应用程序。

答案 31 :(得分:1)

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

答案 32 :(得分:1)

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

1.brew update
2.brew install openssl

答案 33 :(得分:1)

我遇到了很多天的麻烦,并且正在乱砍。事实证明This link对我非常有帮助。它帮助我在MAC OS X 9上成功升级了SSL。

答案 34 :(得分:0)

将此添加到您的gemfile:

gem 'cliver', :git => 'git://github.com/yaauie/cliver', :ref => '5617ce'

答案 35 :(得分:0)

在Ubuntu上安装以下软件包为我解决了这个问题

sudo apt-get install libssl-dev

答案 36 :(得分:0)

这可能是破解/无效SSL证书的问题。在Mac上,您可以使用此命令更新SSL证书:

rvm osx-ssl-certs update all