web-dev-qa-db-ja.com

Ruby 1.9.3を使用すると「証明書の検証に失敗しました」OpenSSLエラー

Mac OS 10.6.8(rvmを使用してインストール)でRuby 1.9.3p0を使用しています。 (GitHubでホストされているアプリケーションテンプレート を使用して新しいRailsアプリケーションを作成しようとすると、次のようになります(例:):

 $ Rails新しいmyapp -m https://github.com/RailsApps/Rails3-application-templates/raw/master/Rails3-mongoid-devise-template.rb -T -O 

私はこのエラーメッセージを受け取ります:

/Users/me/.rvm/rubies/Ruby-1.9.3-p0/lib/Ruby/1.9.1/net/http.rb:799:in `connect ':SSL_connect 
 returned = 1 errno = 0状態= SSLv3サーバー証明書の読み取りB:証明書の検証に失敗しました
(OpenSSL :: SSL :: SSLError)

Ruby言語インタープリターがOpenSSLを使用してGitHubに接続し、アプリケーションテンプレートファイルをリクエストしていることを理解しています。 GitHubでは、SSLを使用してすべての接続を確立する必要があります。 OpenSSLがサーバー証明書を確認できなかったため、接続に失敗しました。

証明書ファイルをダウンロードすることで問題を解決できました:

$ cd /opt/local/etc/openssl
$ Sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ Sudo mv cacert.pem cert.pem 

Ruby 1.9.2を使用しても問題ありませんでした。 Ruby 1.9.3で「証明書の検証に失敗しました」という問題が発生したのはなぜですか?これはRuby 1.9.3バグですか? Mac OS 10.6.8に固有ですか?私の解決策はこれを解決する正しい方法ですか?

18
Daniel Kehoe

正解には多くの可動部分があります。お使いのOSによって異なりますRubyバージョン、OpenSSLバージョン、Rubygemsバージョン。調査した結果、記事を書いてしまいました。私の記事はエラーの理由を説明し、さらに診断するための手順を示し、いくつかを示しています回避策、および可能な解決策を提案します。これは役に立ちます:

OpenSSLエラーおよびRails –証明書の検証に失敗しました

GitHubには関連するコミットと問題へのリンクもあります。

21
Daniel Kehoe

私にとってこれは、最新のRVM(rvm 1.20.12)に更新し、Ruby-1.9.3-p429をインストールした後、自作のOS Xで発生しました。次のコマンドを実行するだけで問題を再現できます。

$ rvm use Ruby-1.9.3-p429
$ irb
1.9.3p429 :001 > require 'open-uri'; open 'https://google.com'
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/net/http.rb:800:in `connect'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/net/http.rb:800:in `block in connect'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/timeout.rb:55:in `timeout'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/timeout.rb:100:in `timeout'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/net/http.rb:800:in `connect'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/net/http.rb:756:in `do_start'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/net/http.rb:745:in `start'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:306:in `open_http'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:775:in `buffer_open'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:203:in `block in open_loop'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:201:in `catch'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:201:in `open_loop'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:146:in `open_uri'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:677:in `open'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:33:in `open'
    from (irb):1
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/bin/irb:16:in `<main>'1.9.3p429 :002 > 

解決策は質問の解決策に似ていましたが、パスが間違っていました。これを実行すると修正されました:

curl https://curl.haxx.se/ca/cacert.pem -o /usr/local/etc/openssl/cert.pem

正しいパスに関する手掛かりは、RVMを介してRuby-1.9.3-p429をインストールするときに、出力に次のように表示されることでした。

Certificates in '/usr/local/etc/openssl/cert.pem' already are up to date.

/usr/local/etc/opensslパス、ただしcert.pemファイルがそのディレクトリにあるため、RVMが証明書が最新であると主張した理由がわかりません。そもそもなぜこれをしなければならなかったのかを知っておくのはいいことですが、今は調査する時間がありません。

13
Liron Yahdav

OpenSSLのRVMインストールに対してRVM Rubyをコンパイルすると、同じ問題が発生しました。問題を解消するために、元の投稿者がダウンロードしたcacerts.pemファイルを〜/ .rvm/usr/ssl/cert.pemに移動しました。

11
Sander Temme

私も同じ問題を抱えていました。

最後に修正した方法は、MacPortsを介してインストールしたOpenSSLのバージョンをアップグレードすることでした。 2009からOpenSSLのバージョンを実行していたため、MacPortsインストールをアップグレードしてから、portsコマンドラインインターフェースを介してOpenSSLインストールをアップグレードしましたが、エラーは表示されなくなりました。

言うまでもなく、MacベースのインストールではRuby/RailsとOpenSSLの間に何らかの統合が必要です。私の場合、FacebookがアプリにoAuth/Loginトークンを送信しているときに(Login with Facebook)が正しく機能しない問題がありました。Devise&OmniAuthは、graph.facebook.com以前のバージョンのOpenSSLにはありませんでした。

2
Robert Brown

Openssl認定ディレクトリは/usr/lib/ssl/ Debian。ですから、次の3行で十分でした。

$ cd /usr/lib/ssl/
$ Sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ Sudo mv cacert.pem cert.pem
1
seyyah

1.9.2と1.9.3のビルド方法が原因である可能性があります—構成されたものをそれぞれ少しずつ異なる方法でビルドするために使用したツールの可能性があります。または、異なるバージョンのOpenSSLを使用している可能性があります。

1.9.2と1.9.3の間でNet:HTTPに見つかる可能性がある唯一の潜在的な関連変更は次のとおりです。

 require 'net/protocol'
-autoload :OpenSSL, 'openssl'
 require 'uri'
+autoload :OpenSSL, 'openssl'

(差分を表示したい場合...)

 git clone https://github.com/Ruby/ruby.git
cd Ruby 
 git diff Origin/Ruby_1_9_2 Origin/Ruby_1_9_3-http.rb 
0
John Bachir

私は同様の問題を抱えていましたが、Railsではなく、Rubyのみでした。cacert.pem証明書と設定を使用して解決しました証明書の場所を環境変数「SSL_CERT_FILE」に

詳細な回答はこちら: https://stackoverflow.com/a/35429863/4747587

0
Henry