OmniAuthを使用してFacebookでユーザーを認証しようとしています。最初は動作していましたが、途中で動作を停止し、次のエラーメッセージが表示され始めました。
OpenSSL :: SSL :: SSLError SSL_connect return = 1 errno = 0 state = SSLv3 read server certificate B:証明書の検証に失敗しました
同じコードがTwitterでもうまく機能し、Facebookで機能しない理由を理解できないようです。私はオンラインで助けを求めましたが、成功していません。
これは私が構築しているウェブサイトへのリンクです: http://www.bestizz.com/
このURLはエラーメッセージを表示します。 http://www.bestizz.com/auth/facebook
Rubyはルート証明書を見つけることができません。 デバッグを目的としたオプションがあります。スクリプトの先頭に次のコードを配置します。
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
次のコードを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 = "/etc/pki/tls/certs/ca-bundle.crt" # for Centos/Redhat
self.verify_mode = OpenSSL::SSL::VERIFY_PEER
self.original_use_ssl = flag
end
end
end
注意:
多くのオペレーティングシステムには、既に証明書バンドルが付属しています。たとえば、Red Hat Enterprise LinuxおよびCentOSでは、次の場所にインストールされます。
/etc/pki/tls/certs/ca-bundle.crt
Ubuntuの場合:
/etc/ssl/certs/ca-certificates.crt
Yosemiteで実行中のRubyを更新した後、Googleで認証しようとしているときに同じ問題に直面しました。
これに続いて:https://toadle.me/2015/04/16/fixing-failing-ssl-verification-with-rvm.html
は私の問題を解決したようです。
歴史のために引用します:
そのため、rvm-installed Rubyは証明書の間違ったディレクトリを検索しますが、OSX-Rubyは正しいディレクトリを検索します。この場合はOSXシステムディレクトリです。
したがって、rvm-installed Rubyが問題です。
Githubに関するこの議論は最終的に解決策を提供しました:何らかの理由でRVMには、Rubyのプリコンパイルされたバージョンが付属しています。
あなたがしたいのは、プリコンパイルされたルビーを使用せずに、Rubyのようにローカルマシンでコンパイルします:rvm install 2.2.0 --disable-binary
最後に、私は実行する必要がありました:
rvm uninstall Ruby-2.2.4
rvm install Ruby-2.2.4 --disable-binary
gem pristine --all
お役に立てれば
FacebookでSSL検証が失敗しているようです。私はOpenSSLマスターではありませんが、これでうまくいくと思います。
OmniAuthの最新バージョン(> = 0.2.2、私はあなたであると仮定)とFaraday> = 0.6.1(スタックトレースはあなたであると言う)のバージョンを使用していると仮定すると、場所を渡すことができますCA証明書バンドルのそれに応じて、FacebookのOmniAuth設定を変更します。
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, 'appid', 'appsecret', {:scope => 'publish_stream,email', :client_options => {:ssl => {:ca_path => '/etc/ssl/certs'}}}
# other providers...
end
'/etc/ssl/certs'
バンドルへのパス。必要な場合は、 このファイル が有効であると考えています。それをどこかに配置し、必要なアクセス許可を与え、アプリにそれを向けるだけです。
詳細な手順については、 this SO answer のAlex Kremerに感謝します。
このリンクは機能するはずです。 https://Gist.github.com/fnichol/86755 指示に従ってください。 Railsインストーラーをダウンロードし、2つのコマンドライン関数を実行する必要があります。
これを行うと、これはopensslで証明書エラーに乗ります
Sudo curl http://curl.haxx.se/ca/cacert.pem -o /opt/local/etc/openssl/cert.pem
私がやったばかりのい回避策は、Net :: HTTPのクラスをオーバーライドし、SSL証明書を検証しないように指示する変数を設定することです。
require 'net/http'
require 'openssl'
class Net::HTTP alias_method :origConnect, :connect
def connect
@ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
origConnect
end
end
Net :: HTTPを呼び出すgemを呼び出すgemを呼び出すgemのソースコードをいじりたくないため、このようにしました。本当に戻って、代わりに個別のcacert.pemファイルを見るためにナッジする方法を理解する必要があります。サーバーのcacert.pemファイルを変更することはできません。変更しないと、それが最適なルートになります。