65 votes

OmniAuth & Facebook: échec de la vérification du certificat

J'ai suivi Railscast #235 pour essayer de bâtir un minimum de Facebook d'authentification.

J'ai d'abord configurer un compte Twitter d'authentification, comme le fait par Ryan lui-même. Qui a fonctionné parfaitement.

Je passe ensuite à l'ajout d'un Facebook login. Cependant, après autoriser l'application de la redirection /auth/facebook/callback d'échec avec:

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

Je suis en train de travailler sur localhost. Je n'ai pas configuré de SSL au sein de l'application. Ce que je fais mal?

74voto

Alex Kremer Points 1219

Le vrai problème est que Faraday (qui Omniauth/Oauth utiliser pour leur HTTP appels) n'est pas n'était pas le réglage de la ca_path variable pour OpenSSL. Au moins sur Ubuntu, en plus de la racine de certificats sont stockés dans "/etc/ssl/certs". Depuis Faraday n'est pas n'est pas la définition de cette variable (et n'a pas actuellement de méthode pour le faire), OpenSSL n'est pas n'était pas de trouver le certificat racine pour Facebook du certificat SSL.

J'ai soumis une demande d'extraction de Faraday qui va ajouter le support pour cette variable et j'espère qu'ils vont tirer de ce changement bientôt. En attendant, vous pouvez monkeypatch faraday à ressembler à de la ce ou de l'utilisation de ma fourche de Faraday. Après cela, vous devez spécifier la version 0.3.0 de la OAuth2 gemme dans votre Gemspec qui supporte le passage de SSL options par le biais de Faraday. Tout ce que vous devez faire maintenant est de mise à niveau de Faraday 0.6.1, qui permet le passage de la ca_path variable et la mise à niveau vers OmniAuth 0.2.2, qui a les bonnes dépendances pour OAuth2. Vous serez alors en mesure de résoudre ce problème simplement en ajoutant ce qui suit à votre Omniauth initialiseur:

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

Donc, pour récapituler:

  1. Faraday doit être mis à jour pour prendre en charge SSL ca_path. Installer Faraday 0.6.1
  2. Votre application doit utiliser OAuth2 la version 0.3.0. Vous devrez peut-être fourche omniauth puisqu'il dispose actuellement d'une version mineure de la dépendance dans la 0.2.x de l'arbre. La mise à niveau vers OmniAuth 0.2.2
  3. Modifier votre fournisseur d'initialiseur pour pointer vers votre système de certificat path ("/etc/ssl/certs" sur Ubuntu et al)

Espérons que les prochaines versions de deux de Faraday et Omniauth intégrera cette solution.

Grâce à KirylP ci-dessus pour le réglage de moi sur le droit chemin.

18voto

Emerson Points 259

J'ai eu ce problème et a tenté à l'aide de l' :ca_path argument sans succès. Après en regardant à travers Github pour un certain temps, je suis tombé sur une suggestion que mentionné à l'aide de :ca_file et pointer directement vers la certification.

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

Si vous avez besoin pour obtenir le chemin d'accès à votre certification des systèmes de fichiers (et votre utilisation de linux), il suffit de taper le terminal. Cela permettra de vous donner un tas d'informations sur votre configuration de SSL, y compris le chemin d'accès (se référer à la OPENSSLDIR). Vous aurez besoin d'ajouter des certs/ca-bundle.crt pour le chemin d'accès fourni.

open-ssl version -a

13voto

Simple Dimple Points 81

Je suis sur Ubuntu 10.10 (Maverick) ... environ 6 heures avant que je ne travaille, partageant mon expérience

  1. n'a pas essayé le singe patch
  2. essayé {: client_options => {: ssl => {: ca_path => "/ etc / ssl / certs"}} mais ne fonctionne toujours pas
  3. essayé ruby 1.8.7 toujours pas travaillé
  4. essayé différentes versions de omniauth et faraday, toujours pas de chance.

La seule chose qui a fait que ça marche était la suite (merci Alex)

 if Rails.env.development? 
  OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 
end
 

7voto

KirylP Points 123

Réussi à passer le Certificat SSL de Vérification comme il doit l'être. Mon projet est à l'aide de 37signals ID pour le camp de base de l'intégration (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

Où 'CLIENT_ID', 'CLIENT_SECRET' que vous pouvez obtenir à 37signals.com et les certificats de fichier bundle gd_bundle.crt de GoDaddy , car 37signals sont à l'aide de leur CA.

6voto

Anand Iyer Points 611

Si vous déployez sur Heroku, vous voulez indiquer l'emplacement du fichier spécifique. Cela fonctionne pour moi (dans 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X