web-dev-qa-db-fra.com

Comment se débarrasser d'OpenSSL :: SSL :: SSLError

J'essaie d'authentifier les utilisateurs avec Facebook avec OmniAuth. Au début, cela fonctionnait, mais en cours de route, il a cessé de fonctionner et a commencé à me donner le message d'erreur suivant:

OpenSSL :: SSL :: SSLError SSL_connect retourné = 1 errno = 0 state = SSLv3 read certificat de serveur B: certificat vérifier a échoué

Le même code fonctionne bien pour Twitter et je n'arrive pas à comprendre pourquoi cela ne fonctionne pas pour Facebook. J'ai cherché de l'aide en ligne, mais je n'ai pas réussi. 

Voici le lien vers le site Web que je construis: http://www.bestizz.com/
Et cette URL vous donnerait le message d'erreur: http://www.bestizz.com/auth/facebook

31
Eugene

Ruby ne trouve aucun certificat racine. Voici une option pour debugging purpose. Mettez le code suivant au début de votre script:

   require 'openssl'
   OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
20
RAJ

Ajoutez le code suivant à 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

Remarque:

De nombreux systèmes d'exploitation sont déjà livrés avec un ensemble de certificats fourni. Par exemple, dans Red Hat Enterprise Linux et CentOS, il est installé dans:

/etc/pki/tls/certs/ca-bundle.crt

Pour Ubuntu, c'est:

/etc/ssl/certs/ca-certificates.crt
8
Amal Kumar S

Je suis confronté au même problème après la mise à jour de Ruby sous Yosemite, mais en essayant de s’authentifier auprès de Google.

Suite à cela: https://toadle.me/2015/04/16/fixing-failing-ssl-verification-with-rvm.html a semblé résoudre mon problème.

Pour l'amour de l'histoire, je vais citer:

Ainsi, Ruby installé avec rvm recherche les certificats dans le mauvais répertoire, tandis que Ruby OSX recherche le bon. Dans ce cas, il s’agit d’un répertoire système OSX.

C'est donc le problème posé par Ruby installé avec rvm.

Cette discussion sur Github a finalement donné la solution: RVM est livré avec une version précompilée de Ruby qui est liée statiquement à un openssl qui recherche dans/etc/openssl ses certificats.

Ce que vous voulez faire est de NE PAS UTILISER les rubis précompilés et que Ruby soit compilé sur votre ordinateur local, comme ceci: rvm install 2.2.0 --disable-binary

À la fin, je devais courir:

rvm uninstall Ruby-2.2.4
rvm install Ruby-2.2.4 --disable-binary
gem pristine --all

J'espère que cela t'aides

7
rpbaltazar

On dirait que la vérification SSL échoue pour Facebook. Je ne suis pas un maître OpenSSL, mais je pense que cela devrait fonctionner pour vous.

En supposant que vous utilisiez une version mise à jour d'OmniAuth (> = 0.2.2, je suppose que vous l'êtes) et une version de Faraday> = 0.6.1 (la trace de la pile indique que vous l'êtes), vous pouvez indiquer l'emplacement de votre ensemble de certificats d'autorité de certification. Modifiez votre configuration OmniAuth pour Facebook en conséquence:

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

et remplacez '/etc/ssl/certs' par le chemin d'accès à votre paquet. Si vous en avez besoin, je crois que ce fichier fonctionnera pour vous - mettez-le simplement quelque part, accordez-lui les autorisations nécessaires et dirigez votre application vers celui-ci.

Merci à Alex Kremer de cette SO réponse pour les instructions détaillées.

6
Michelle Tilley

Ce lien devrait fonctionner. https://Gist.github.com/fnichol/867550 Suivez simplement les instructions. Vous devrez télécharger le programme d'installation de Rails et exécuter deux fonctions de ligne de commande.

1
JohnOsborne

Faites ceci, cela éliminera l'erreur du certificat avec openssl

Sudo curl http://curl.haxx.se/ca/cacert.pem -o /opt/local/etc/openssl/cert.pem
0
Raymond Gao

Une solution de contournement que je viens de faire est de redéfinir la classe dans Net :: HTTP et de définir la variable qui lui dit de ne pas vérifier les certificats 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

Je l'ai fait de cette façon parce que je ne veux pas me mêler du code source de la gemme qui appelle la gemme qui appelle la gemme qui appelle Net :: HTTP. Je devrais vraiment revenir en arrière et comprendre comment le pousser à regarder plutôt un fichier cacert.pem séparé. Je ne peux pas modifier le fichier cacert.pem du serveur, sinon ce serait le meilleur chemin.

0
JBB