66

Railscast#235に従って、最小限のFacebook認証を設定してみました。

ライアン自身が行ったように、私は最初にTwitter認証を設定しました。それは完璧に機能しました。

次に、Facebookログインの追加に移りました。ただし、アプリを承認した後、リダイレクト先は次のように/auth/facebook/callback失敗します。

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

私はローカルホストに取り組んでいます。アプリ内でSSLを設定しませんでした。私は何が間違っているのですか?

4

18 に答える 18

74

本当の問題は、Faraday(Omniauth / OauthがHTTP呼び出しに使用する)OpenSSLのca_path変数を設定していなかったことです。少なくともUbuntuでは、ほとんどのルート証明書は「/ etc / ssl/certs」に保存されています。Faradayこの変数を設定していなかったため(現在、設定するメソッドがありません)、OpenSSLFacebookのSSL証明書のルート証明書を検出していませんでした。

私はファラデーにプルリクエストを送信しました。これにより、この変数のサポートが追加され、すぐにこの変更がプルされることを願っています。それまでは、このように見えるようにモンキーパッチを適用するか、ファラデーの私のフォークを使用することができます。その後、SSLオプションのファラデーへの受け渡しをサポートするバージョン0.3.0のOAuth2gemをGemspecで指定する必要があります。ここで行う必要があるのは、ca_path変数の受け渡しをサポートするFaraday 0.6.1にアップグレードし、OAuth2に適切な依存関係を持つOmniAuth0.2.2にアップグレードすることだけです。その後、Omniauth初期化子に以下を追加するだけで、この問題を適切に修正できます。

Rails.application.config.middleware.use OmniAuth::Builder do
    provider :facebook, FACEBOOK_KEY, FACEBOOK_SECRET, {:client_options => {:ssl => {:ca_path => "/etc/ssl/certs"}}}
end

要約すると、次のようになります。

  1. SSL ca_pathをサポートするには、ファラデーを更新する必要があります。Faraday0.6.1をインストールします
  2. アプリはOAuth2バージョン0.3.0を使用する必要があります。現在、0.2.xツリーにマイナーバージョンの依存関係があるため、omniauthをフォークする必要がある場合があります。OmniAuth0.2.2にアップグレードします
  3. システムの証明書パス(Ubuntuなどでは「/ etc / ssl / certs」)を指すようにプロバイダー初期化子を変更します

うまくいけば、FaradayとOmniauthの両方の次のリリースにこのソリューションが組み込まれるでしょう。

私を正しい道に導いてくれた上記のKirylPに感謝します。

于 2011-04-11T07:23:22.017 に答える
18

私はこの問題を抱えていて、:ca_path引数を使用しようとしましたが成功しませんでした。しばらくGithubを調べた後、:ca_fileを使用して、証明書を直接指すという提案に出くわしました。

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, 'secret_key', 'secret_key',
   :client_options => {:ssl => {:ca_file => '/etc/pki/tls/certs/ca-bundle.crt'}}}
end

システム認証ファイル(および使用しているLinux)へのパスを取得する必要がある場合は、ターミナルから入力するだけです。これにより、パス(OPENSSLDIRを参照)など、SSL設定に関する一連の情報が得られます。提供されたパスにcerts/ca-bundle.crtを追加する必要があります。

open-ssl version -a
于 2011-04-30T06:01:35.013 に答える
13

私はubuntu10.10(Maverick)を使用しています...それが機能するようになる前に約6時間苦労し、私の経験を共有しました

  1. モンキーパッチを試しませんでした
  2. {:client_options => {:ssl => {:ca_path => "/ etc / ssl / certs"}}を試しましたが、まだ機能しません
  3. ルビー1.8.7を試しましたがまだ機能しません
  4. omn​​iauthとfaradayのさまざまなバージョンを試しましたが、まだ運がありません。

それを機能させた唯一のことはフォローすることでした(アレックスに感謝します)

if Rails.env.development? 
  OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 
end
于 2011-04-23T17:41:56.240 に答える
7

必要に応じてSSL証明書の検証を行うことができました。私のプロジェクトでは、Basecamp統合に37signals IDを使用しています(Ruby 1.9.2-p130、Rails 3.0.4)。

RAILS_ROOT / config / initializers / omniauth.rb

require 'omniauth/oauth'

Rails.application.config.middleware.use OmniAuth::Strategies::ThirtySevenSignals,
    'CLIENT_ID', 'CLIENT_SECRET', {client_options: {ssl: {ca_file: Rails.root.join('gd_bundle.crt').to_s}}}

module OAuth2
  class Client
    def initialize(client_id, client_secret, opts = {})
      adapter = opts.delete(:adapter)
      self.id = client_id
      self.secret = client_secret
      self.site = opts.delete(:site) if opts[:site]
      self.options = opts
      self.connection = Faraday::Connection.new(site, {ssl: opts.delete(:ssl)})
      self.json = opts.delete(:parse_json)        # ^ my code starts here

      if adapter && adapter != :test
        connection.build { |b| b.adapter(adapter) }
      end
    end
  end
end

'CLIENT_ID'、'CLIENT_SECRET'は、37signals.comで入手でき、37signalsはCAを使用しているため、 GoDaddyから証明書バンドルファイルgd_bundle.crtを入手できます。

于 2011-02-11T15:02:52.483 に答える
6

Herokuにデプロイする場合は、特定のファイルの場所を指定する必要があります。これは私にとってはうまくいきます(config / initializers / omniauth.rbで):

Rails.application.config.middleware.use OmniAuth::Builder do
  # This cert location is only for Heroku
  provider :facebook, APP_ID, APP_SECRET, {:client_options => {:ssl => {:ca_file => "/usr/lib/ssl/certs/ca-certificates.crt"}}}
end
于 2011-05-24T15:00:20.503 に答える
5

http://certifie.com/ca-bundle/のCAバンドルでこれを解決しました。

そして私のDevise初期化子では:

:client_options => { :ssl => { :ca_file => "#{Rails.root}/config/ca-bundle.crt" } } }
于 2011-06-28T12:49:07.773 に答える
4

Omniauthが新しいバージョンのFaradayを使用しているように見えます。これは、上記のモンキーパッチが機能しなかった理由を説明しています。より良い方法があるはずだと私は同意しますが、テストのためにそれを機能させる必要がある他の人のために、ここに更新されたバージョンがあります:

(次のコードを使用して、初期化子ディレクトリにファイルを作成します)

require 'faraday'
module Faraday
class Adapter
 class NetHttp < Faraday::Adapter
  def call(env)
  super
  url = env[:url]
  req = env[:request]

  http = net_http_class(env).new(url.host, url.inferred_port)

  if http.use_ssl = (url.scheme == 'https' && env[:ssl])
    ssl = env[:ssl]
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    http.cert        = ssl[:client_cert] if ssl[:client_cert]
    http.key         = ssl[:client_key]  if ssl[:client_key]
    http.ca_file     = ssl[:ca_file]     if ssl[:ca_file]
    http.cert_store  = ssl[:cert_store]  if ssl[:cert_store]
  end

  http.read_timeout = http.open_timeout = req[:timeout] if req[:timeout]
  http.open_timeout = req[:open_timeout]                if req[:open_timeout]

  if :get != env[:method]
    http_request = Net::HTTPGenericRequest.new \
      env[:method].to_s.upcase,    # request method
      !!env[:body],                # is there data
      true,                        # does net/http love you, true or false?
      url.request_uri,             # request uri path
      env[:request_headers]        # request headers

    if env[:body].respond_to?(:read)
      http_request.body_stream = env[:body]
      env[:body] = nil
    end
  end

  begin
    http_response = if :get == env[:method]
      # prefer `get` to `request` because the former handles gzip (ruby 1.9)
      http.get url.request_uri, env[:request_headers]
    else
      http.request http_request, env[:body]
    end
  rescue Errno::ECONNREFUSED
    raise Error::ConnectionFailed, $!
  end

  http_response.each_header do |key, value|
    response_headers(env)[key] = value
  end
  env.update :status => http_response.code.to_i, :body => http_response.body

  @app.call env
end
end
end
end
于 2011-04-07T17:40:41.687 に答える
4

すべての解決策が私にはうまくいきませんでした、そして私はこれを見つけました

http://railsapps.github.io/openssl-certificate-verify-failed.html

rvm osx-ssl-certs update all

osx 10.8 ruby​​ 2.0.0(rvm経由)

于 2013-08-13T18:38:35.390 に答える
2

編集:より関連性があるので、以下の答えを確認してください

これは私のために働きました( https://github.com/jspoonerの好意で修正):

次のモンキーパッチを使用して、イニシャライザのディレクトリにファイルを作成します。

require 'faraday'
module Faraday
class Adapter
 class NetHttp < Faraday::Adapter
  def call(env)
    super

    is_ssl = env[:url].scheme == 'https'

    http = net_http_class(env).new(env[:url].host, env[:url].port || (is_ssl ? 443 : 80))
    if http.use_ssl = is_ssl
      ssl = env[:ssl]
      if ssl[:verify] == false
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE
      else
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE # <= PATCH or HACK ssl[:verify]
      end
      http.cert    = ssl[:client_cert] if ssl[:client_cert]
      http.key     = ssl[:client_key]  if ssl[:client_key]
      http.ca_file = ssl[:ca_file]     if ssl[:ca_file]
    end
    req = env[:request]
    http.read_timeout = net.open_timeout = req[:timeout] if req[:timeout]
    http.open_timeout = req[:open_timeout]               if req[:open_timeout]

    full_path = full_path_for(env[:url].path, env[:url].query, env[:url].fragment)
    http_req  = Net::HTTPGenericRequest.new(
      env[:method].to_s.upcase,    # request method
      (env[:body] ? true : false), # is there data
      true,                        # does net/http love you, true or false?
      full_path,                   # request uri path
    env[:request_headers])       # request headers

    if env[:body].respond_to?(:read)
      http_req.body_stream = env[:body]
      env[:body] = nil
    end

    http_resp = http.request http_req, env[:body]

    resp_headers = {}
    http_resp.each_header do |key, value|
      resp_headers[key] = value
    end

    env.update \
      :status           => http_resp.code.to_i,
      :response_headers => resp_headers,
      :body             => http_resp.body

    @app.call env
  rescue Errno::ECONNREFUSED
    raise Error::ConnectionFailed.new(Errno::ECONNREFUSED)
  end

  def net_http_class(env)
    if proxy = env[:request][:proxy]
      Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:user], proxy[:password])
    else
      Net::HTTP
    end
  end
 end
end
end
于 2010-12-07T17:07:49.283 に答える
2

私はFaraday0.6.1とOAUTH2を使用しています(単独で、何にもラップされていません)。これは私にとって問題を解決するのに十分でした(Gentooでは、Ubuntoで動作するはずです)

これを回します

  client = OAuth2::Client.new(FACEBOOK_API_KEY, FACEBOOK_API_SECRET, :site => FACEBOOK_API_SITE)

これに

  client = OAuth2::Client.new(FACEBOOK_API_KEY, FACEBOOK_API_SECRET, :site => FACEBOOK_API_SITE, :ssl => {:ca_path => '/etc/ssl/certs' })
于 2011-05-08T02:29:59.347 に答える
1

私の問題は、openSSLが正しい証明書ディレクトリを使用していることを確認することで解決しました。

私のシステム(ubuntu64)の場合、これは次のとおりです。ENV ['SSL_CERT_DIR'] ='/ usr / share / ca-certificates /'

これは、JRuby1.6.0でjruby-opensslを使用していました

この設定をdevelopment.rbに追加しました

于 2011-04-24T01:27:27.787 に答える
1

これは些細なことのように聞こえますが、正しいプロトコルを使用していることを確認してください。このエラーが発生し続けた後、http経由で接続しようとしていることに気付きました。私はばかなので1.5時間も無駄になりました。

于 2012-12-04T11:33:57.210 に答える
0

Ubuntuでは、私がしなければならなかったのは/environments/development.rbを次のように更新することだけでした。

Rails.application.config.middleware.use OmniAuth::Builder do
    provider :facebook, FACEBOOK_KEY, FACEBOOK_SECRET, {:client_options => {:ssl => {:ca_path => "/etc/ssl/certs"}}}
end

その後:

cd /etc/ssl/certs
sudo wget http://curl.haxx.se/ca/cacert.pem

ウォラ!

于 2012-04-14T20:19:49.273 に答える
0

私はついにMountainLionの修正を見つけました。参照:http ://coderwall.com/p/f4hyqw

rvm pkg install openssl
rvm reinstall 1.9.3 --with-openssl-dir=$rvm_path/usr
于 2012-08-22T06:53:22.310 に答える
0

これは1.9.xの問題のようです。1.8.7に戻すと、問題が修正されました。

于 2010-10-20T14:51:32.170 に答える
0

Leopardで特に問題が発生した場合に、私が行ったことは次のとおりです。

私の証明書は古く、更新する必要がありました。私はこれをダウンロードしました:

http://curl.haxx.se/ca/cacert.pem

次に、ここLeopardで見つかった私の証明書を置き換えました。

/usr/share/curl/curl-ca-bundle.crt

アクセスしているものは何でもリロードしてください。

于 2011-08-25T04:06:21.810 に答える
0

指示が私のために働いたもののために少し異なっていたという理由だけで、私は私の2セントを加えると思いました:

私はOSXLionを使用していて、macportsとrvmを使用しています

curl-ca-bundleをインストールしました:

sudo port install curl-ca-bundle

次に、omniauthの構成を次のように調整しました。

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, APP_CONFIG['CONSUMER_KEY'], APP_CONFIG['CONSUMER_SECRET'],
           :scope => 'https://www.google.com/m8/feeds https://www.googleapis.com/auth/userinfo.profile',
           :ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}
end
于 2012-03-24T16:58:37.157 に答える
0

MountainLionでRVMを使用して同様のエラーが発生しました。RubyはSSL接続を承認するために必要なCA証明書を見つけることができないようです。インストールする必要があります。この解決策はトリックを行いました:

http://fredwu.me/post/28834446907/fix-openssl-error-on-mountain-lion-and-rvm

(実際にそのページをブラウザにロードすることはできませんでしたが、Googleのキャッシュで見つける必要がありました。)

簡単な答えは次のとおりです。

curl http://curl.haxx.se/ca/cacert.pem -o ~/.rvm/usr/ssl/cert.pem

これで完了です。

于 2012-09-13T21:04:30.853 に答える