簡體   English   中英

OpenSSL :: SSL :: SSLError:SSL_connect返回= 1 errno = 0狀態= SSLv3讀取服務器證書B:證書驗證失敗

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

我使用RVM在Ubuntu 12.04上安裝Ruby 1.9.3

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

然后當我嘗試按照以下方式運行時:

require 'open-uri'
open('https://www.google.com/')

我收到錯誤: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

我該如何解決這個問題? 我有許多類似的線程,人們在OSX中有這個問題,但我如何在Ubuntu中解決它?

謝謝你的幫助。

如果未使用本機OpenSSL庫正確設置默認的“OpenSSL目錄”,則有時會發生這種情況。 open-uri使用OpenSSL::X509::Store#set_default_paths告訴OpenSSL在OpenSSL目錄中查找包含OpenSSL默認信任的受信任根證書的文件。

在您的情況下,此查找失敗。 您可以通過設置覆蓋默認設置的環境變量使其成功,並告訴OpenSSL查找該目錄:

export SSL_CERT_FILE=/etc/pki/tls/cert.pem

這是我的Fedora 16 64位上的根CA捆綁的默認位置,其他受歡迎的位置是/etc/ssl/ca-bundle.crt等。在您的情況下,RVM使用的OpenSSL庫位於$ rvm_path / usr中,所以你應該四處尋找合適的默認根CA文件候選者。 正確設置環境變量后,對open-uri的調用將成功。

要使環境變量成為永久變量,請使用常用方法,例如在.bashrc,/ etc / profile中定義導出或在您的情況下最適合的任何方式。

rvm安裝的openssl中缺少cacert.pem文件。

$ cd $rvm_path/usr/ssl
$ sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ sudo mv cacert.pem cert.pem

將“認證”gem添加到您的Gemfile中。

更多信息: https//rubygems.org/gems/certified

請參閱http://jjinux.blogspot.nl/2012/02/ruby-working-around-ssl-errors-on-os-x.html作為您問題的替代答案,它應該適用於Ubuntu和Mac OS X用戶並不需要更改環境變量。

來自以上鏈接的解決方案:

# config/initializers/fix_ssl.rb
# 
# Work around errors that look like:
#
#   SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

require 'open-uri'
require 'net/https'

module Net
  class HTTP
    alias_method :original_use_ssl=, :use_ssl=

    def use_ssl=(flag)
      # Ubuntu
      if File.exists?('/etc/ssl/certs')
        self.ca_path = '/etc/ssl/certs'

      # MacPorts on OS X
      # You'll need to run: sudo port install curl-ca-bundle
      elsif File.exists?('/opt/local/share/curl/curl-ca-bundle.crt')
        self.ca_file = '/opt/local/share/curl/curl-ca-bundle.crt'
      end

      self.verify_mode = OpenSSL::SSL::VERIFY_PEER
      self.original_use_ssl = flag
    end
  end
end

這確實對我有用。 當我運行“brew doctor”時開始工作的事情,這讓我得到了“未設置SSL_CERT_DIR”的線索

檢查你的系統時鍾!

在長時間(1周)之后在虛擬機上使用此錯誤而不使用。 更新系統時鍾可以立即解決問題。

如果您正在運行ntpd那么ntpdate -b -u pool.ntp.org將為您執行此操作。

暫無
暫無

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

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