18

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で解決するにはどうすればよいですか?

ご協力いただきありがとうございます。

4

6 に答える 6

25

これは、デフォルトの「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、または状況に最も適したものでエクスポートを定義するなど、通常の方法を使用します。

于 2012-05-24T00:27:53.187 に答える
11

「認定された」gem を Gemfile に追加します。

詳細: https://rubygems.org/gems/certified

于 2013-03-05T18:52:17.170 に答える
10

cacert.pem ファイルが rvm でインストールされた openssl にありません。

$ cd $rvm_path/usr/ssl
$ sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ sudo mv cacert.pem cert.pem
于 2012-06-14T21:09:39.227 に答える
5

質問に対する別の回答として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
于 2013-01-07T15:45:41.023 に答える
0

これでうまくいきました。「brew doctor」を実行すると、「unset SSL_CERT_DIR」などの手がかりが得られました。

于 2015-09-11T17:53:14.610 に答える