Comment se débarrasser D'OpenSSL:: SSL:: SSLError
j'essaie d'authentifier les utilisateurs avec Facebook en utilisant OmniAuth. Au début, ça marchait, mais en cours de route ça s'est arrêté et a commencé à me donner ce message d'erreur:
OpenSSL:: SSL:: SSLError SSL_connect retourné=1 errno=0=SSLv3 lire certificat de serveur B: certificat vérifier échec
le même code fonctionne bien pour Twitter et je ne semble pas comprendre pourquoi il ne fonctionne pas pour Facebook. J'ai cherché de l'aide en ligne, mais je n'ai pas réussi.
C'est 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
7 réponses
Ruby ne trouve aucun certificat de racine. Voici une option pour débogage . Mettez le code suivant au début de votre script:
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
ajouter 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
Note:
de nombreux systèmes d'exploitation sont déjà fournis avec un paquet 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 its à:
/etc/ssl/certs/ca-certificates.crt
j'ai été confronté au même problème après avoir mis à jour Ruby en cours d'exécution sur Yosemite, mais en essayant d'authentifier avec Google.
qui suit: https://toadle.me/2015/04/16/fixing-failing-ssl-verification-with-rvm.html
semble résoudre mon problème.
pour l'histoire je vais citer:
de sorte que le ruby installé par rvm ne regarde pas dans le mauvais répertoire pour les certificats tandis que L'OSX-ruby regardera dans le bon. Dans c'est cas c'est un OSX système de répertoire.
donc le ruby installé rvm est le problème.
cette discussion sur Github a finalement donné la solution: en quelque sorte RVM est livré avec une version précompilée de ruby qui est liée statiquement avec une openssl qui regarde dans /etc/openssl pour ses certificats.
ce que vous voulez faire est de ne pas utiliser les rubis précompilés et plutôt avoir ruby compilé sur votre machine locale, comme so: RVM install 2.2.0 -- disable-binaire
à la fin, j'ai dû courir:
rvm uninstall ruby-2.2.4
rvm install ruby-2.2.4 --disable-binary
gem pristine --all
Espérons que cette aide
semble que la vérification SSL échoue pour Facebook. Je ne suis pas maître D'OpenSSL, mais je pense que ça devrait marcher pour toi.
en supposant que vous utilisez une version à jour D'OmniAuth (>= 0.2.2, je suppose que vous l'êtes) et une version de Faraday >= 0.6.1 (la trace de pile indique que vous l'êtes), vous pouvez passer l'emplacement de votre paquet de certificats CA. 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 remplacer '/etc/ssl/certs'
par la voie pour votre bundle. Si vous en avez besoin, je crois que ce fichier fonctionnera pour vous--il suffit de le mettre quelque part, de lui donner les permissions nécessaires, et de pointer votre application vers elle.
merci à Alex Kremer à cette réponse ainsi pour les instructions détaillées.
Ce lien devrait fonctionner. https://gist.github.com/fnichol/867550 suivez les instructions. Vous devrez télécharger L'installateur de Rails et exécuter deux fonctions de ligne de commande.
une mauvaise solution que je viens de faire est de surcharger la classe dans Net:: HTTP et de définir la variable qui lui dit de ne pas vérifier les certs 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 muck avec le code source du gem qui appelle le gem qui appelle le gem qui appelle Net::HTTP. Je devrais vraiment retourner et de comprendre comment les pousser à regarder distinct cacert.pem file à la place. Je ne peux pas modifier le cacert du serveur.pem, ou ce serait le meilleur itinéraire.
Fais ceci, cela va se faire chevaucher de l'erreur de certificat avec openssl
sudo curl http://curl.haxx.se/ca/cacert.pem -o /opt/local/etc/openssl/cert.pem