SSL_connect returned=1 errno=0 state=SSLv3读服务器证书B:证书验证失败

我正在使用Authlogic-Connect进行第三方登录。在运行适当的迁移后,Twitter/谷歌/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'

请建议. .

278060 次浏览

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

然后,正如这篇博客文章所建议的,

如何治愈Net::HTTP的风险默认HTTPS行为

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

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

我是这样解决的:

  1. 你可以这样做:

    • sudo port install curl-ca-bundle[如果你正在使用MacPorts]
    • 或者直接把它拉下来wget http://curl.haxx.se/ca/cacert.pem
    • 李< / ul > < / >
    • 执行试图验证SSL认证的ruby代码:SSL_CERT_FILE=/opt/local/etc/certs/cacert.pem rails generate jquery:install。在你的情况下,你想要将它设置为服务器拾取它的某个地方的环境变量,或者在你的环境中添加类似ENV['SSL_CERT_FILE'] = /path/to/your/new/cacert.pem的东西。rb文件。

你也可以只安装CA文件(我没有尝试过这个)到操作系统——有很长的指令在这里——这应该以类似的方式工作,但我个人没有尝试过。

基本上,您遇到的问题是一些web服务正在响应针对OpenSSL无法验证的CA签名的证书。

下面是用于调试的另一个选项。

请确保永远不要在任何生产环境中使用它,因为它首先就会抵消使用SSL的好处。只有在您的本地开发环境中才可以这样做。

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

如果您在Leopard上有特别的问题,以下是我所做的帮助。

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

< a href = " http://curl.haxx.se/ca/cacert。pem " rel = " http://curl.haxx.se/ca/cacert.pem nofollow”> < / >

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

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

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

下面是如何在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

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

在最新macport的Mac OS X Lion上:

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

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

注意,自从Eric G在5月12日回答后,证书文件的位置似乎发生了变化。

只是因为对我有用的说明略有不同,我想我补充一下我的意见:

我在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

这招对我很管用

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

我的ubuntu 12.04的openssl实现有问题

问题是ruby找不到可以信任的根证书。在1.9 ruby检查这个。您需要确保系统中有pem文件形式的curl证书。您还需要确保证书位于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

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

https://github.com/stevegraham/certified < a href = " https://github.com/stevegraham/certified " > < / >

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

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

OSX的解决方案:

安装最新的RVM稳定版本

rvm get stable

使用RVM命令自动解析证书

rvm osx-ssl-certs update all

如果你在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/4353伊恩·康纳

对我来说最直接的答案是

sudo apt-get install openssl ca-certificates

瞧! !

OS x 10.8。x与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
我遇到了好几天的麻烦,到处乱闯。这个链接被证明对我非常有帮助。它帮助我在MAC OS X 9上成功升级了SSL。

虽然知道这是一个相当蹩脚的解决方案,但我仍然分享这一点,因为似乎很少有人在这里回答使用窗户,我认为一些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,并把一个证书文件。

虽然很蹩脚,但这肯定会奏效。

这可能是损坏/无效SSL证书的问题。在mac上可以使用此命令更新SSL证书:

rvm osx-ssl-certs update all

一行程序在Admin提示符中修复了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]

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

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

brew update
brew remove openssl
brew install openssl

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

我已经尝试用brew安装curl-ca-bundle,但这个包已经没有可用的了:

$ 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)中添加这一行:

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

然后更新你的终端:

$ source ~/.bash_profile

你在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版本)。

我通过在终端中运行这个解决了这个问题。完整的写入可通过在这里实现

rvm install 2.2.0 --disable-binary

如果你在本地运行你的rails应用程序,那么只需在application.rb底部添加这一行。

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

在此之后,您可以使用应用程序没有任何问题。你可以称之为黑客,但不建议这样做。只在需要本地运行时使用

我在开发Ruby项目时遇到了同样的问题。我使用的是64bit的Windows 7。

我是这样解决的:

  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

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

1.brew update
2.brew install openssl

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

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

sudo apt-get install libssl-dev

只需在gemfile中添加gem 'certified',然后运行bundle install。

  1. 宝石的认证
  2. 包安装

添加到你的gemfile:

gem 'cliver',:git =>'git://github.com/yaauie/cliver',:ref =>“公元5617年” < /代码> < / p >

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

这适用于我在Windows中的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维基

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

对我来说,有效的答案是:

# 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

在Ruby 2.3.4中遇到这个问题:

我解了OpenSSL,然后重新安装。我跑:

brew uninstall --ignore-dependencies openssl

然后

brew install openssl

它做到了。