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
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
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
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
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.
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.
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
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.