簡體   English   中英

SSL_connect 返回=1 errno=0 state=SSLv3 讀取服務器證書B:證書驗證失敗

[英]SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

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

請建議..

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

你也可以在CA文件(我沒有試過)安裝到操作系統-有冗長的說明在這里-這應該以類似的方式工作,但我還沒有嘗試過這種個人。

基本上,您遇到的問題是某些 Web 服務正在使用針對 OpenSSL 無法驗證的 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 版本替換2.2.3 ):

rvm reinstall 2.2.3 --disable-binary

歸功於https://stackoverflow.com/a/32363597/4353Ian Connor

以下是在 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

要使其成為永久設置,請將其添加到您的控制面板中

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 上運行,則需要使用默認證書位置/etc/ssl/certs來設置ca_path屬性。

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

問題是 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

新認證的 gem 旨在解決這個問題:

https://github.com/stevegraham/certified

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

  1. 寶石“認證
  2. 捆綁安裝

在裝有最新 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 日回答以來,證書文件位置似乎已更改。

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

嗯,這對我有用

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

我的 ubuntu 12.04 的 openssl 實現有問題

這是用於調試目的的另一個選項。

一定不要在任何生產環境中使用它,因為它首先會抵消使用 SSL 的好處。 僅在您的本地開發環境中執行此操作才有效。

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

雖然知道這是一個相當蹩腳的解決方案,但我仍然分享這個,因為似乎很少有人在這里回答使用Windows ,而且我認為一些 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 路徑可能因每個環境而luislavena (例如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在我的本地磁盤中並將證書文件放入其中。

跛腳,這肯定會奏效。

我嘗試使用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 (或~/.zshrc for zsh)中添加這一行:

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

然后更新您的終端:

$ source ~/.bash_profile

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

對我有用的最直接的答案是這個

sudo apt-get install openssl ca-certificates

瞧!!!

帶有 Homebrew 的 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

這對我有用。 如果您使用 rvm 和 brew:

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

我遇到了這個問題,盡管我是 OSX 上的 RVM 用戶,但建議的rvm osx-ssl-certs update all不起作用。

對我有用的修復是重新安裝最新版本的 openssl:

brew update
brew remove openssl
brew install openssl

我通過在終端中運行它來解決這個問題。 完整的文章可以在這里找到

rvm install 2.2.0 --disable-binary

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

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

在此之后,您可以毫無問題地使用該應用程序。 您可以稱其為黑客,但不建議這樣做。 僅在需要在本地運行時使用

然后,正如這篇博文所暗示的那樣,

" 如何解決 Net::HTTP 默認的有風險的 HTTPS 行為"

您可能想要安裝always_verify_ssl_certificates gem,它允許您為ca_file設置默認值。

OSX 解決方案:

安裝最新的rvm穩定版本

rvm get stable

使用 rvm 命令自動解決證書問題

rvm osx-ssl-certs update all

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

對我有用的是答案的組合,即:

# 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

如果您在 Leopard 上遇到特殊問題,以下是我所做的幫助。

我的證書很舊,需要更新。 我下載了這個:

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

然后替換了我在 Leopard 上找到的證書:

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

重新加載您訪問它的任何內容,您應該很高興!

僅僅因為說明對我有用的東西略有不同,我想我加了 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

我遇到了好幾天的麻煩,並且一直在四處閑逛。 事實證明, 此鏈接對我非常有幫助。 它幫助我在 MAC OS X 9 上成功升級了 SSL。

有時在 MAC OSX 中並不總是 rvm 的問題,如果您刪除 .rvm,問題仍然存在(尤其是從 timemachine 備份數據時),您可以嘗試這種方式。

1.brew update
2.brew install openssl

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM