SSL_connectが返されました= 1 errno = 0 state = 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

これが私がこれまでに見つけた最良の解決策ですstackoverflow.com/a/16983443/11792
Pavel Nikolov

回答:


138

Rails 3のJQueryジェネレーターを使用しようとすると、同様の問題が発生しました

私はそれを次のように解決しました:

  1. CURL Certificate Authority(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。あなたの場合、サーバーがそれを選択する場所のいずれかで環境変数としてこれを設定するかENV['SSL_CERT_FILE'] = /path/to/your/new/cacert.pem、environment.rbファイルに何かを追加する必要があります。

CAファイル(私はこれを試していません)をOSにインストールすることもできます - ここには長い説明があります -これは同じように機能するはずですが、私は個人的には試していません。

基本的に、発生している問題は、一部のWebサービスが、OpenSSLが検証できないCAに対して署名された証明書で応答していることです。


1
これは、RubyスクリプトからRuby Net :: IMAPを使用してGmailアカウントに接続しようとしているときにも機能しました。
Jignesh Gohel

4
はい、これはruby-1.9.3では問題なく動作します。私はそれを私のbash設定に追加しました。 export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cert.pem
andersjanmyr

5
私は/ usr / local / etc / opensslを持っていなかったので、次を実行し sudo curl http://curl.haxx.se/ca/cacert.pem >> /usr/local/etc/cacert.pemました export SSL_CERT_FILE=/usr/local/etc/cacert.pem
Lilith River

4
私のMacで開発し、SSL_CERT_FILE=/usr/local/etc/openssl/cert.pemアプリの.envファイルに追加しました。
Dave Sag 2013

8
wgetを使用してcurl証明書をダウンロードする皮肉に感謝します。
Trey

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.3Rubyバージョンで置き換えてください)。

rvm reinstall 2.2.3 --disable-binary

https://stackoverflow.com/a/32363597/4353およびIan Connorの功績によるものです。


2
ここでの選択肢とはるかに包括的な過去記事です:railsapps.github.io/openssl-certificate-verify-failed.html
ピーター・P.

エラー:RVM更新が削除されました。代わりに 'rvm get'およびrvm 'rubygems' CLI APIを参照してください
ヤン

@ user432506どのようにしてそのエラーが発生しましたか?最新の安定したRVMを使用していますが、引き続き機能します。
htanata

4
これはしばらくの間機能し、その後は失敗します。私にとってうまくいったことは実行されていましたrvm reinstall 2.2.0 --disable-binaryが、インストールをバンドルして新しく開始する必要があります。
Ian Connor

2
これは大きな命の恩人であり、受け入れられる答えになるはずです。
Siraris 2016

129

Windowsで修正する方法は次のとおりです:https : //gist.github.com/867550(Fletcher Nicholにより作成)

抜粋:

手動の方法(退屈)

http://curl.haxx.se/ca/cacert.pemcacert.pemからファイルをダウンロードします。このファイルをに保存します。C:\RailsInstaller\cacert.pem

次に、を設定してrubyに認証局バンドルを認識させますSSL_CERT_FILE。現在のコマンドプロンプトセッションでこれを設定するには、次のように入力します。

set SSL_CERT_FILE=C:\RailsInstaller\cacert.pem

これを永続的な設定にするには、これをコントロールパネルに追加します。


6
ありがとうございました。これは非常に便利で、非常に簡単です。
John

上記の解決策は私を助けませんでした。これは、Windowsのためのより良いガイドです:stackoverflow.com/questions/5720484/...
Sprachprofi

@Sprachprofiリンクしたソリューションは、一度に1つのRailsプロジェクトでのみ機能します(その証明書を直接指定しているため)。私がリンクした要点(Fletcher Nicholによって作成された)は、証明書を探しているすべてのプロジェクト/ gemをカバーできるようにします。
ryanjones

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

(明らかに、必要に応じてルビのバージョンを置き換えます)。


これでうまくいきました。あなたが指摘しているブログ投稿も役に立ちます。ありがとうございます。
クリスティアン

2
これはエルキャピタンで私のために働いた。私はrvmを爆破しました(rvm implode)。再びインストールし\curl -sSL https://get.rvm.io | bash -s stable --autolibs=homebrewた後、rvm install <ruby-version> --disable-binary ある時点で、私もやったrvm get headこれらは、いくつかの最先端の問題があるとして。
rylanb 2015年

もともと私はEl CapitanにRuby 2.0.0を使用しており、何らかの理由で正しいバージョンでも古いバージョンが機能しなかったため、このソリューションのみが機能しましたSSL_CERT_FILE。後rvm install 2.2.0 --disable-binary、問題はソートされました。
laimison

20

問題は、rubyが信頼するルート証明書を見つけられないことです。1.9の時点で、rubyはこれをチェックします。システムにcurm証明書が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


2
Ubuntu 12.04での私にとって、機能する証明書パスは~/.rvm/usr/ssl/cert.pem
Nazar Hussain

システムが証明書を探している場所をdtrussを使用してどのように解決しますか?
pingu 2013年

@pinguは、基本的にdrussを実行する正確なコマンドを思い出せないため、「検査」したいルビープロセスを実行するように指示します。出力は非常に詳細ですが、基本的には、rubyが行っている各システムコールを確認できます。呼び出しの1つは、存在しないファイルを指すファイル読み取り呼び出しです。証明書をここに移動するか、リンクを作成してください。これで問題ありません。
スチュワート

Rubyはcacert.pemOS X上でを探すべきではありません。OSXはを使用しませんcacert.pem。システム証明書とユーザー証明書はKeyChainに保存されます。RubyはOS X上のキーチェーンと統合されなければならない
JWW

これを行う最良の方法は何ですか?例を投稿できますか?
Stewart

19

新しい認定宝石はこれを修正するように設計されています:

https://github.com/stevegraham/certified


ruby 2.0.0p481(2014-05-08)で動作します[i386-mingw32]
Evmorov 14

1
Rails 4.1.9、ruby-2.1.5では動作しません。私はそれをGemfileに追加しました。念のためbundle明示的に追加require "certified"しましたが、何も変更されていません。何が欠けていますか?
Isaac Betesh、2015年

Rubyはcacert.pemOS X上でを探すべきではありません。OSXはを使用しませんcacert.pem。システム証明書とユーザー証明書はKeyChainに保存されます。RubyはOS XのKeyChainと統合する必要があります。OpenSSL はを配布したことがありませんcacert.pem。なぜソフトウェアがOpenSSLを採用するのかははっきりしません。
jww 2015

18

gemfileにgem 'certified'を追加して、bundle installを実行するだけです。

  1. 宝石「認定
  2. バンドルインストール

これがEl Capitanに役立つことを確認します。ありがとう!
mcmlxxxiii

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、2012

1
それはそれを修正しました。しかし、opensslがhomebrewでインストールされている限り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/

ミラニオの方法:

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 => gem sources -r rubygems.org => gem sources -a rubygems.org => gem install [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
のRaf

私のために働いた、Mac OS X Yosemite。ありがとう!
2015年

12

ここでは答えが不十分なソリューションであることを知っていますが、ここでは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、ローカルディスクにディレクトリを作成し、そこに証明書ファイルを挿入しました。

現状のままでも、これは確実に機能します。


2
鮮やかさ。ハッキーですが、これが私の問題を解決した唯一のものでした。
Daniel Magliola、2014

デバッグの良い方法...私にとってユーザーは「ジャスティン」でした。Googlingは、これがRubyInstallerの既知の問題であると思われることを示しています。残念ながら、自分でそのディレクトリ(+ pemファイル)を作成しても、問題は解決しませんでした
Wouter

12

私がインストールしようとしてきたcurl-ca-bundlebrewはなく、パッケージには、より多くの何も利用できません。

$ 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

これでうまくいきました。@dnlmzwパスは私にとっては問題ありませんでしたが、もちろんこれは設定によって異なります。ありがとう!
theartofbeing

自分のgemソースに自己署名証明書を使用するプライベートgemサーバーのURLを追加しようとすると、うまくいきませんでした。OSX 10.11.6 + rbenv
sixty4bit

12

デバッグのための別のオプションを次に示します。

そもそもSSLを使用するメリットがなくなるため、本番環境では絶対に使用しないでください。これは、ローカルの開発環境でのみ有効です。

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

26
反対投票:はい、これは機能しますが、有効なCAバンドルをインストールして問題を実際に解決するための障壁が非常に低いため、このようなソリューション(SSLのセキュリティをほぼ完全に無効にする)は、次の場合を除いて実装する必要のあるソリューションではありません。認証局に完全にアクセスできない環境にいる(そして、それでも、両方のエンドポイントにアクセスできるローカルCAを作成する必要がある)。
yaauie

10
SSL保護を完全に削除するのではなく、完全に削除します。絶対にしないでください。
drbrain

15
デバッグにはそれで十分です
rickyduck

1
これにより、現在1.9に警告が生成されます
Ivan

2
これは、実際のインターネットを介した本番環境での作業には不適切なソリューションですが、「SSLをまったく使用しない方がよい」というのは特に間違いです。暗号化されたトラフィックは、暗号化されていないトラフィックよりも優れています。はい、中間者攻撃の可能性はありますが、プレーンテキストトラフィックを傍受するだけでは、少なくとも1ノッチは立ち上がれません。
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なので、環境変数の値にはバックスラッシュを使用する必要があります。
クリスチャンバウマン

これは、rubygems sslエラーを修正した後、「バンドル」を修正するために機能した唯一の解決策です
DonBecker

7

私にとってうまくいった最も簡単な答えはこれでした

sudo apt-get install openssl ca-certificates

そして出来上がり!!!


1
私が複数回投票できるといいのに、あなたは私をそんなに時間を節約しただけです!
Stephen

1
@Stephen-私もあなたができればいいのに:-) 時間を大幅に節約できたので、ここに投稿したいと思いました。他の人にも役立つかもしれません。
Pratik Bothra 14年

7

OSX 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

1
10.9でも動作します。
サミサムフリ2013年

1
OK、OS X 10.9.1。驚くばかり!
rogeriopradoj 2013

これらのばかげた問題を修正するためにランダムなソリューションを探し出さなければならないとき、何かがひどく壊れています。これらの答えはすべて、まったく異なることを行い、それらはすべて、ある時点で人々を助けるように見えました。WTF?
sergserg 2014年

13
curl-ca-bundleがbrewから削除されました
Fa11enAngel 2014


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


3

OSXソリューション:

最新のRVM安定バージョンをインストールする

rvm get stable

rvmコマンドを使用して証明書を自動的に解決する

rvm osx-ssl-certs update all

1
私はこれを試してみましたが、うまくいきませんでした。これが私の解決策です:stackoverflow.com/a/16741712/62
Liron Yahdav

RVM経由でRuby 2.0.0をインストールした後、私のために働いた。
クリスピーターズ

3

Railsアプリをローカルで実行している場合は、application.rbの下部にこの行を追加します。

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

この後、問題なくアプリを使用できます。ハックと呼ぶこともできますが、お勧めできません。ローカルで実行する必要がある場合にのみ使用します


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 Zoo(ca-bundle.crt)全体を忘れて(おそらくそうすべき)、Google Internet Authority 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

いつかそれはだ常にRVMの問題ではありません あなたは.rvm削除する場合は、まだ(espciallyタイムマシンからあなたのバックアップデータ中)の問題は、あなたがこの方法を試すことができ、MAC OSXで。

1.brew update
2.brew install openssl

1

gem 'certified', '~> 1.0'私に追加してGemfile実行すると、bundleこの問題が解決しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.