web-dev-qa-db-ja.com

HerokuでのOpenSSL :: SSL :: SSLError

FacebookまたはTwitterを介してユーザーを認証し、ユーザーに情報を入力してもらい、[保存]をクリックして(ユーザーレコードを作成する)しようとしています。その最後のステップで、[保存]をクリックした後にOpenSSLエラーが発生します。これは、Devise RegistrationsController#createメソッドで発生します。

そのため、HerokuでホストされているRailsアプリケーションでこのエラーが発生します:

2012-07-28T18:25:13+00:00 app[web.1]: OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed)

私はたくさんの解決策を見てきましたが、どれもうまくいきません。これが私が試したいくつかのことです:

1)certifiedgemのインストール

2)Heroku gemをv2.30にアップグレードし、もう一度プッシュします

3)これ:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :Twitter, Twitter_KEY, Twitter_SECRET, {:client_options => {:ssl => {:ca_file => "/usr/lib/ssl/certs/ca-certificates.crt"}}}
  provider :facebook, FACEBOOK_KEY, FACEBOOK_SECRET, {:scope => "publish_actions,user_location,email", :client_options => {:ssl => {:ca_file => "/usr/lib/ssl/certs/ca-certificates.crt"}}}
end

この証明書ファイルが実際に存在しないことが1つの問題のように思われます。これはいくつかの場所で見られ、Herokuのca_certファイルへのデフォルトパスのようですが、間違っている可能性があります。

奇妙なことに、これは起こっています  すでにFB/Twitterで認証しており、ユーザーのアカウントを作成しようとしています。これはなぜで、どうすればこれを解決/デバッグできますか?心から混乱しています。

更新: この行をOmniauth初期化子に追加したところ、「機能」しました。したがって、問題はOmniauthにあると診断しました。ただし、SSL検証を引き続き使用したいのですが...これは明らかにセキュリティギャップを残します。

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

20
varatis

ここでいくつか検索した後、私が見つけたものは次のとおりです。

Rubyを使用してhttps経由で外部サーバーへの接続を開く場合(Facebook Graph APIなど)、次のエラーが発生する可能性があります。

OpenSSL::SSL::SSLError:SSL_connectreturned=1errno=0state=SSLv3readservercertificateB:certificateverifyfailed

このエラーは、Rubyセキュリティで保護されたWebサーバーの信頼性を検証するために使用される認証局証明書(CA証明書)を見つけることができないためです。解決策はこれをダウンロードすることです ca -bundle.crt アプリケーションのlib/ディレクトリに:次に、次のコードをconfig/initializers/fix_ssl.rbに追加します。

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

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

    def use_ssl=(flag)
      self.ca_file = Rails.root.join('lib/ca-bundle.crt').to_s
      self.verify_mode = OpenSSL::SSL::VERIFY_PEER
      self.original_use_ssl = flag
    end
  end
end

これにより、Rubyは、アプリケーションのlib /ディレクトリからCAバンドルを使用するように強制されます。

取得元: http://jimneath.org/2011/10/19/Ruby-ssl-certificate-verify-failed.html

更新:

システムによっては、self.ca_path=の代わりにself.ca_file=を使用する必要がある場合があります。

40
Pavel Nikolov

OmniAuthで適切なopenssl構成を使用しているようですが、CA証明書のパスが正しくない可能性がありますか?

次のコマンドを実行して、herokuサーバーでこれを確認できます。

heroku run bash

...次にopensslを実行して、適切なパスを表示します。

$ openssl version -a
OpenSSL 1.0.0e 6 Sep 2011
OPENSSLDIR: "/usr/lib/ssl"

... ca_certificates.crtファイルは$ OPENSSLDIR/certs /ca-certificates.crtにあります。

そのパスが一致するようにコードを更新することを確認します。

7
Winfield