[ruby-on-rails] SSL_connect返回= 1 errno = 0狀態= SSLv3讀取服務器證書B:證書驗證失敗


14 Answers

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

rvm osx-ssl-certs update all

更多信息在這裡: http://rvm.io/support/fixing-broken-ssl-certificates : http://rvm.io/support/fixing-broken-ssl-certificates

這裡是完整的解釋: https://github.com/wayneeseguin/rvm/blob/master/help/osx-ssl-certs.md : 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和Ian Connor 。

Question

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

請建議..




問題是,紅寶石找不到可信的根證書。 截至1.9紅寶石檢查這一點。 您需要確保您的系統上有捲曲證書,並以pem文件的形式出現。 您還需要確保證書位於Ruby預期的位置。 你可以拿到這個證書......

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

如果您的RVM和OSX用戶,那麼您的證書文件位置將根據您使用的Ruby版本而有所不同。 使用:ca_path顯式設置路徑是一個糟糕的想法,因為您的代碼在生產時不可移植。 在那裡你想在默認位置提供一個紅寶石證書(並假設你的開發人員知道他們在做什麼)。 您可以使用dtruss來確定係統正在查找證書文件的位置。

在我的情況下,系統正在尋找中的證書文件

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

不過MACOSX系統會期望有一個證書

/System/Library/OpenSSL/cert.pem

我將下載的證書複製到這個路徑並且工作。 HTH




一個班輪在管理員提示中修復了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]



在帶有最新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日回答以來,證書文件的位置似乎發生了變化。




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




我遇到了這個問題,儘管我是OSX上的RVM用戶,但rvm osx-ssl-certs update all的建議修復無法正常工作。

對我而言,修復工作是重新安裝最新版本的openssl:

brew update
brew remove openssl
brew install openssl



為我工作的最直接的答案是這樣的

sudo apt-get install openssl ca-certificates

瞧!




gem 'certified', '~> 1.0'到我的Gemfile並運行bundle解決了我的這個問題。




雖然知道這是一個蹩腳的解決方案,但我仍然在分享,因為在這裡回答的人似乎很少使用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放入我的本地磁盤並放入一個證書文件。

跛腳如此,這一定會奏效。




僅僅因為說明對我而言有些不同,我以為我加了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



如果你在本地運行你的rails應用程序,那麼只需在application.rb的底部添加這行。

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

在此之後,您可以使用該應用程序沒有任何問題。 你可以稱它為黑客,但不建議。 僅在需要在本地運行時使用




我嘗試使用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



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




OSX解決方案:

安裝最新的rvm穩定版本

rvm get stable

使用rvm命令自動解決證書

rvm osx-ssl-certs update all








Related