SSL_connect retourné = 1 errno = 0 état = SSLv3 lire le certificat du serveur B: la vérification du certificat a échoué


281

J'utilise Authlogic-Connect pour les connexions tierces. Après avoir exécuté les migrations appropriées, les connexions Twitter / Google / yahoo semblent fonctionner correctement, mais la connexion Facebook génère une exception:

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

Le journal des développeurs affiche

OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed):
  app/controllers/users_controller.rb:37:in `update'

Veuillez suggérer..


2
Est-ce que cela aide: stackoverflow.com/q/3977303/382818
Zabba

Voici la meilleure solution que j'ai pu trouver jusqu'à présent stackoverflow.com/a/16983443/11792
Pavel Nikolov

Réponses:


138

J'ai rencontré un problème similaire en essayant d'utiliser le générateur JQuery pour Rails 3

Je l'ai résolu comme ceci:

  1. Obtenez le bundle CURL Certificate Authority (CA). Vous pouvez le faire avec:

    • sudo port install curl-ca-bundle [si vous utilisez MacPorts]
    • ou tirez-le directement wget http://curl.haxx.se/ca/cacert.pem
  2. Exécutez le code Ruby qui tente de vérifier la certification SSL: SSL_CERT_FILE=/opt/local/etc/certs/cacert.pem rails generate jquery:install. Dans votre cas, vous voulez soit la définir comme variable d'environnement quelque part où le serveur la récupère, soit ajouter quelque chose comme ENV['SSL_CERT_FILE'] = /path/to/your/new/cacert.pemdans votre fichier environment.rb.

Vous pouvez également simplement installer les fichiers CA (je n'ai pas essayé) sur le système d'exploitation - il y a de longues instructions ici - cela devrait fonctionner de la même manière, mais je n'ai pas essayé cela personnellement.

Fondamentalement, le problème que vous rencontrez est qu'un service Web répond avec un certificat signé contre une autorité de certification qu'OpenSSL ne peut pas vérifier.


1
Cela a également fonctionné pour moi tout en essayant de me connecter à mon compte gmail en utilisant Ruby Net :: IMAP à partir d'un script ruby.Merci.
Jignesh Gohel

4
Oui, cela fonctionne bien sur ruby-1.9.3. Je l'ai ajouté à ma configuration bash. export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cert.pem
andersjanmyr

5
Je n'avais pas / usr / local / etc / openssl, j'ai donc couru sudo curl http://curl.haxx.se/ca/cacert.pem >> /usr/local/etc/cacert.pemsuivi de export SSL_CERT_FILE=/usr/local/etc/cacert.pem
Lilith River

4
En développant sur mon Mac, je viens d'ajouter SSL_CERT_FILE=/usr/local/etc/openssl/cert.pemau .envfichier de mon application et le tour est joué - tout est heureux.
Dave Sag

8
J'apprécie l'ironie d'utiliser wget pour télécharger les certificats curl.
Trey

135

Si vous utilisez RVM sur OS X, vous devrez probablement exécuter ceci:

rvm osx-ssl-certs update all

Plus d'informations ici: http://rvm.io/support/fixing-broken-ssl-certificates

Et voici l'explication complète: https://github.com/wayneeseguin/rvm/blob/master/help/osx-ssl-certs.md


Mettre à jour

Sur Ruby 2.2, vous devrez peut-être réinstaller Ruby à partir de la source pour résoudre ce problème. Voici comment (remplacer 2.2.3par votre version Ruby):

rvm reinstall 2.2.3 --disable-binary

Nous remercions https://stackoverflow.com/a/32363597/4353 et Ian Connor .


2
Voici un résumé beaucoup plus complet avec des alternatives: railsapps.github.io/openssl-certificate-verify-failed.html
Peter P.

ERREUR: la mise à jour rvm a été supprimée. Voir à la place 'CLI rvm get' et rvm 'rubygems'
yang

@ user432506 Comment avez-vous obtenu cette erreur? J'utilise le dernier RVM stable et cela fonctionne toujours.
htanata

4
Cela fonctionnerait pendant un certain temps, puis échouerait pour moi. Ce qui a fonctionné pour moi était en cours d'exécution, rvm reinstall 2.2.0 --disable-binarymais vous devez regrouper l'installation et recommencer à zéro.
Ian Connor

2
Ce fut une énorme bouée de sauvetage et devrait être la réponse acceptée.
Siraris

129

Voici comment vous pouvez le corriger sous Windows: https://gist.github.com/867550 (créé par Fletcher Nichol)

Extrait:

La voie manuelle (ennuyeuse)

Téléchargez le cacert.pemfichier depuis http://curl.haxx.se/ca/cacert.pem . Enregistrez ce fichier dans C:\RailsInstaller\cacert.pem.

Rendez maintenant ruby ​​au courant de votre ensemble d'autorité de certification en définissant SSL_CERT_FILE. Pour définir cela dans votre session d'invite de commandes actuelle, tapez:

set SSL_CERT_FILE=C:\RailsInstaller\cacert.pem

Pour en faire un paramètre permanent, ajoutez-le dans votre panneau de configuration .


6
Je vous remercie. Ceci est exceptionnellement utile et également très simple.
John

La solution ci-dessus ne m'a pas aidé. Ceci est un meilleur guide pour Windows: stackoverflow.com/questions/5720484/…
Sprachprofi

@Sprachprofi La solution à laquelle vous vous êtes connecté ne fonctionnera que pour 1 projet de rails à la fois (car vous pointez directement vers ce certificat). L'essentiel auquel j'ai lié (créé par Fletcher Nichol) lui permettra de couvrir tous les projets / gemmes qui recherchent un certificat.
ryanjones

31

Ruby ne trouve aucun certificat racine auquel faire confiance.

Jetez un oeil à ce billet de blog pour une solution: " Ruby 1.9 et l'erreur SSL ".

La solution consiste à installer le curl-ca-bundleport qui contient les mêmes certificats racine utilisés par Firefox:

sudo port install curl-ca-bundle

et dites à votre httpsobjet de l'utiliser:

https.ca_file = '/opt/local/share/curl/curl-ca-bundle.crt'

Notez que si vous souhaitez que votre code s'exécute sur Ubuntu, vous devez définir l' ca_pathattribut à la place, avec l'emplacement des certificats par défaut /etc/ssl/certs.


8
Cela semble également se produire sous Windows, auquel cas la solution recommandée ne fonctionnera pas.
Bob Aman

24

La raison pour laquelle vous obtenez cette erreur sur OSX est le rubis installé par rvm.

Si vous rencontrez ce problème sur OSX, vous pouvez en trouver une explication très large dans cet article de blog:

http://toadle.me/2015/04/16/fixing-failing-ssl-verification-with-rvm.html

La version courte est que, pour certaines versions de Ruby, RVM télécharge des fichiers binaires précompilés, qui recherchent des certificats au mauvais endroit. En forçant RVM à télécharger la source et à compiler sur votre propre machine, vous vous assurez que la configuration de l'emplacement du certificat est correcte.

La commande pour ce faire est:

rvm install 2.2.0 --disable-binary

si vous avez déjà la version en question, vous pouvez la réinstaller avec:

rvm reinstall 2.2.0 --disable-binary

(évidemment, remplacez votre version rubis si nécessaire).


Cela a fonctionné pour moi. Le blog que vous pointez est également utile, merci!
Cristian

2
Cela a fonctionné pour moi sur El Capitan. J'ai implosé rvm (rvm implode). Installé à nouveau avec \curl -sSL https://get.rvm.io | bash -s stable --autolibs=homebrewpuis rvm install <ruby-version> --disable-binary à un moment donné, j'ai également fait rvm get headcar ce sont des problèmes de pointe.
rylanb

Seule cette solution a fonctionné pour moi, car à l'origine, j'avais Ruby 2.0.0 sur El Capitan et pour une raison quelconque, l'ancienne version ne fonctionnait même pas correctement SSL_CERT_FILE. Après rvm install 2.2.0 --disable-binary, le problème a été réglé.
laimison

20

Le problème est que ruby ​​ne trouve pas de certificat racine de confiance. À partir de 1.9 rubis vérifie cela. Vous devrez vous assurer que vous disposez du certificat curl sur votre système sous la forme d'un fichier pem. Vous devrez également vous assurer que le certificat se trouve à l'emplacement auquel ruby ​​s'attend. Vous pouvez obtenir ce certificat à ...

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

Si vous êtes un utilisateur RVM et OSX, l'emplacement de votre fichier de certificat variera en fonction de la version de ruby ​​que vous utilisez. La définition explicite du chemin avec: ca_path est une mauvaise idée car votre code ne sera pas portable lorsqu'il arrivera en production. Là, vous voulez fournir à ruby ​​un certificat à l'emplacement par défaut (et supposez que vos gars de développement savent ce qu'ils font). Vous pouvez utiliser dtruss pour déterminer où le système recherche le fichier de certificat.

Dans mon cas, le système recherchait le fichier CERT dans

/Users/stewart.matheson/.rvm/usr/ssl/cert.pem

cependant le système MACOSX s'attendrait à un certificat

/System/Library/OpenSSL/cert.pem

J'ai copié le certificat téléchargé sur ce chemin et cela a fonctionné. HTH


2
Pour moi sur Ubuntu 12.04, le chemin du cert qui fonctionne est~/.rvm/usr/ssl/cert.pem
Nazar Hussain

Comment utilisez-vous dtruss pour déterminer où le système recherche le certificat?
pingu

@pingu ne se souvient pas exactement de la commande que vous exécutez druss et vous lui dites d'exécuter le processus ruby ​​que vous souhaitez qu'il "inspecte". Sa sortie est très détaillée mais vous pourrez voir chaque appel système que ruby ​​effectue. L'un des appels sera un appel de fichier lu qui pointera vers un fichier qui n'existe pas. Déplacez le certificat ici ou créez un lien et vous devriez être prêt à partir.
Stewart

Ruby ne doit pas rechercher cacert.pemOS X. OS X ne l'utilise pas cacert.pem. Les certificats système et utilisateur sont stockés dans KeyChain. Ruby devrait s'intégrer à KeyChain sur OS X.
jww

Quelle est la meilleure façon de procéder? Pouvez-vous poster un exemple?
Stewart

19

Le nouveau bijou certifié est conçu pour résoudre ce problème:

https://github.com/stevegraham/certified


Fonctionne avec ruby ​​2.0.0p481 (2014-05-08) [i386-mingw32]
Evmorov

1
Ne fonctionne pas pour moi avec Rails 4.1.9, ruby-2.1.5. Je l'ai ajouté au Gemfile, bundleexplicitement ajouté require "certified"juste pour être sûr, et rien ne change. Qu'est-ce que je rate?
Isaac Betesh

Ruby ne doit pas rechercher cacert.pemOS X. OS X ne l'utilise pas cacert.pem. Les certificats système et utilisateur sont stockés dans KeyChain. Ruby devrait s'intégrer à KeyChain sur OS X. OpenSSL n'a jamais distribué a cacert.pem. Ce n'est pas clair pour moi pourquoi un logiciel s'en remettrait à OpenSSL.
2015

18

Ajoutez simplement gem 'certifié' dans votre gemfile et exécutez l'installation du bundle.

  1. bijou ' certifié '
  2. installation du bundle

Confirmant que cela a aidé El Capitan. Merci!
mcmlxxxiii

Cela fonctionne parfaitement avec Rails et Debian :) big big thanks!
Szymon Rut

17

Sur Mac OS X Lion avec le dernier macport:

sudo port install curl-ca-bundle  
export SSL_CERT_FILE=/opt/local/share/curl/curl-ca-bundle.crt  

Ensuite, réexécutez le travail ayant échoué.

Remarque, l'emplacement du fichier cert semble avoir changé depuis la réponse d'Eric G le 12 mai.


Après toutes les recherches et une multitude de tentatives, c'est la seule chose qui a résolu le problème. Merci!
shawnwall

1
cool, ça l'a réparé. Mais aussi longtemps que openssl est installé avec homebrew, vous devez ajouter un export SSL_CERT_FILE=/usr/local/etc/openssl/cacert.pemà votre fichier
.profile

14

Un one liner le corrige pour Windows dans une invite d'administration

choco install wget(voir d'abord chocolatey.org )

wget http://curl.haxx.se/ca/cacert.pem -O C:\cacert.pem && setx /M SSL_CERT_FILE "C:\cacert.pem"

Ou faites simplement ceci:

gem sources -r https://rubygems.org/
gem sources -a http://rubygems.org/

La méthode de Milanio:

gem sources -r https://rubygems.org
gem sources -a http://rubygems.org 
gem update --system
gem sources -r http://rubygems.org
gem sources -a https://rubygems.org

gem install [NAME_OF_GEM]

1
Petite amélioration - il vous suffit de mettre à jour ruby ​​et vous pouvez ensuite ajouter la source https - cela a fonctionné pour moi comme un charme: gem sources -r rubygems.org => gem sources -a rubygems.org => gem update --system => gem sources -r rubygems.org => gem sources -a rubygems.org => gem install [NAME_OF_GEM]
milanio

13

Eh bien, cela a fonctionné pour moi

rvm pkg install openssl
rvm reinstall 1.9.2 --with-openssl-dir=$rvm_path/usr

Quelque chose ne va pas avec la mise en œuvre d'OpenSL de mon Ubuntu 12.04


3
Cela fonctionne, mais je devais finir avec ceci: curl -O http://curl.haxx.se/ca/cacert.pem, mv cacert.pem cert.pem,mv cert.pem $rvm_path/usr/ssl
Raf

A travaillé pour moi, Mac OS X Yosemite. Merci!
anevaude

12

Tout en sachant que c'est une solution plutôt boiteuse, je partage toujours cela car il semble que très peu de personnes qui répondent ici utilisent Windows , et je pense que certains utilisateurs de Windows (moi y compris) apprécieraient une approche simple et intuitive.

require 'openssl'
puts OpenSSL::X509::DEFAULT_CERT_FILE

Cela indique où votre openssl recherche le fichier cert. Mon nom n'est pas Luis, mais le mien l'était C:/Users/Luis/Code/luislavena/knap-build/var/knapsack/software/x86-windows/openssl/1.0.0l/ssl/cert.pem. Le chemin peut être différent selon chaque environnement (par exemple openknapsackau lieu de luislavena).

Le chemin n'a pas changé même après set SSL_CERT_FILE=C:\foo\bar\baz\cert.pemvia la console, alors ... J'ai créé le répertoire C:\Users\Luis\Code\luislavena\knap-build\var\knapsack\software\x86-windows\openssl\1.0.0l\ssl sur mon disque local et y ai mis un fichier cert.

Aussi boiteux soit-il, cela fonctionnera sûrement.


2
Brillant. Hacky, mais c'était la seule chose qui a résolu mon problème.
Daniel Magliola

Belle façon de déboguer ... Pour moi, l'utilisateur était "Justin". La recherche sur Google montre que cela semble être un problème connu avec RubyInstaller. Malheureusement, la création de ce répertoire (+ fichier pem) moi-même n'a pas résolu le problème pour moi
Wouter

12

J'ai essayé d'installer curl-ca-bundleavec brew, mais le package n'est plus disponible:

$ brew install curl-ca-bundle
Error: No available formula for curl-ca-bundle 
Searching formulae...
Searching taps...

La solution qui m'a fonctionné sur Mac était:

 $ cd /usr/local/etc/openssl/certs/
 $ sudo curl -O http://curl.haxx.se/ca/cacert.pem

Ajoutez cette ligne dans votre ~/.bash_profile(ou ~/.zshrcpour zsh):

export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem

Mettez ensuite à jour votre terminal:

$ source ~/.bash_profile

1
Cela a fonctionné pour moi - mais le chemin est faux. Devrait être:export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem
dnlmzw

2
C'est une bonne solution, en raison de sa simplicité. De plus, en référençant le certificat ajouté dans ~/.bash_profile, il laisse un rappel de ce qui a été ajouté (et, surtout, où) lorsque des mises à jour supplémentaires sont nécessaires.
auxbuss

Cela a fonctionné pour moi. @dnlmzw, le chemin me convenait mais cela dépend bien sûr de votre configuration. Merci!
theartofbeing

n'a pas fonctionné pour moi lorsque j'essayais d'ajouter une URL de serveur gem privé qui utilise un certificat auto-signé à mes sources gem. OSX 10.11.6 + rbenv
sixty4bit

12

Voici une autre option à des fins de débogage.

Assurez-vous de ne jamais l'utiliser dans un environnement de production, car cela annulera les avantages de l'utilisation de SSL en premier lieu. Cela n'est valable que dans votre environnement de développement local.

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

26
Downvoted: Oui, cela fonctionne, mais la barrière à l'installation d'un bundle CA valide et à la résolution du problème est si faible qu'une solution comme celle-ci - qui invalide presque complètement la sécurité de SSL - n'est pas une solution qui devrait être mise en œuvre à moins que vous 'êtes dans un environnement où l'autorité de certification est complètement inaccessible (et même dans ce cas, vous devez créer une autorité de certification locale accessible aux deux points de terminaison).
yaauie

10
Il n'a pas complètement supprimé la protection SSL, il la supprime complètement. Ne fais jamais ça.
drbrain

15
Pour le débogage, il suffit
rickyduck

1
Cela génère un avertissement maintenant en 1.9
Ivan

2
Il s'agit d'une mauvaise solution pour le travail de production sur Internet, mais il n'est absolument pas vrai que "vous pourriez tout aussi bien ne pas utiliser SSL du tout". Le trafic chiffré sur le câble est meilleur que le trafic en clair. Oui, vous avez la possibilité d'attaques man-in-the-middle, mais celles-ci sont au moins un cran plus difficiles à supporter que d'écouter simplement le trafic en clair pendant qu'il glisse.
Mark Reed

10

J'ai eu ce même problème en travaillant sur un projet Ruby. J'utilise Windows 7 64 bits.

J'ai résolu ce problème en:

  1. Téléchargement du fichier cacert.pem depuis http://curl.haxx.se/ca/cacert.pem .
  2. Enregistré ce fichier dans C: /RubyCertificates/cacert.pem
  3. Ensuite, définissez ma variable d'environnement "SSL_CERT_FILE" sur "C: \ RubyCertificates \ cacert.pem"

source: https://gist.github.com/fnichol/867550


Comme il s'agit de Windows, les backslahes doivent être utilisés dans la valeur de la variable d'environnement.
Christian Baumann

c'est la seule solution qui a fonctionné pour corriger le "bundle" pour moi, après avoir corrigé l'erreur ssl
rubygems

7

La réponse la plus simple qui a fonctionné pour moi était la suivante:

sudo apt-get install openssl ca-certificates

Et le tour est joué !!!


1
J'aurais aimé pouvoir voter plus d'une fois parce que tu m'as sauvé tellement de temps!
Stephen

1
@Stephen - J'aimerais que vous le puissiez aussi :-). Cela m'a fait gagner beaucoup de temps, alors j'ai pensé l'afficher ici, et cela pourrait aussi aider quelqu'un d'autre.
Pratik Bothra

7

OS X 10.8.x avec Homebrew:

brew install curl-ca-bundle
brew list curl-ca-bundle
cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem

1
Fonctionne aussi pour moi sur 10.9.
Sami Samhuri

1
Ok pour moi, OS X 10.9.1. Impressionnant!
rogeriopradoj

Quelque chose est gravement cassé lorsque vous devez rechercher des solutions aléatoires pour résoudre ces problèmes stupides. Toutes ces réponses font quelque chose de complètement différent et toutes semblent aider les gens à un moment donné. WTF?
sergserg

13
curl-ca-bundle a été retiré du brassage
Fa11enAngel


4

Cela a fonctionné pour moi. Si vous utilisez rvm et brew:

rvm remove 1.9.3
brew install openssl
rvm install 1.9.3 --with-openssl-dir=`brew --prefix openssl`

4

J'ai rencontré ce problème et le correctif suggéré de rvm osx-ssl-certs update alln'a pas fonctionné malgré le fait que je suis un utilisateur RVM sur OSX.

Le correctif qui a fonctionné pour moi consistait à réinstaller la dernière version de openssl:

brew update
brew remove openssl
brew install openssl

4

J'ai résolu ce problème en exécutant cela dans le terminal. La rédaction complète est disponible ici

rvm install 2.2.0 --disable-binary

3

Solution OSX:

installer la dernière version stable de rvm

rvm get stable

utiliser la commande rvm pour résoudre les certificats automatiquement

rvm osx-ssl-certs update all

1
J'ai essayé ça et ça n'a pas marché pour moi. Voici ma solution: stackoverflow.com/a/16741712/62
Liron Yahdav

A fonctionné pour moi après l'installation de Ruby 2.0.0 via RVM.
Chris Peters

3

Si vous exécutez votre application rails localement, ajoutez simplement cette ligne au bas de application.rb.

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

Après cela, vous pouvez utiliser l'application sans aucun problème. Vous pouvez appeler cela un hack mais ce n'est pas recommandé. Utiliser uniquement lorsque vous devez exécuter localement


2

Voici ce que j'ai fait pour vous aider si vous rencontrez spécifiquement un problème avec Leopard.

Mon certificat était ancien et devait être mis à jour. J'ai téléchargé ceci:

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

Puis remplacé mon certificat qui a été trouvé ici sur Leopard:

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

Rechargez tout ce que vous avez qui y accède et vous devriez être prêt à partir!


2

Juste parce que les instructions étaient légèrement différentes pour ce qui a fonctionné pour moi, j'ai pensé ajouter mes 2 cents:

Je suis sur OS X Lion et j'utilise macports et rvm

J'ai installé curl-ca-bundle:

sudo port install curl-ca-bundle

Ensuite, j'ai ajusté ma configuration omniauth comme suit:

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

Vous pouvez (et devriez probablement) renoncer à l'ensemble du CA Zoo ( ca-bundle.crt) et utiliser Google Internet Authority G2 dans :ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}. C'est le seul nécessaire pour certifier les connexions à Google.
jww

2

Si vous avez un lien symbolique dans / usr / local / etc / openssl pointant vers cert.pem, essayez de faire ceci:

ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE" (should be /usr/local/etc/openssl)
cd /usr/local/etc/openssl
wget http://curl.haxx.se/ca/cacert.pem
ln -s cacert.pem 77ee3751.0 (77ee3751.0 is my symbolic link, should depend on the openssl version)

2

Ce qui a fonctionné pour moi est une combinaison de réponses, à savoir:

# Reinstall OpenSSL
brew update
brew remove openssl
brew install openssl
# Download CURL CA bundle
cd /usr/local/etc/openssl/certs
wget http://curl.haxx.se/ca/cacert.pem
/usr/local/opt/openssl/bin/c_rehash
# Reinstall Ruby from source
rvm reinstall 2.2.3 --disable-binary

1

J'ai eu des problèmes pendant plusieurs jours et je piratais. Ce lien s'est avéré extrêmement utile pour moi. Cela m'a aidé à faire une mise à niveau réussie de SSL sur MAC OS X 9.


1

Parfois, ce n'est pas toujours le problème de rvm dans MAC OSX, si vous supprimez .rvm, le problème persiste (en particulier lorsque vous sauvegardez les données de timemachine), vous pouvez essayer de cette façon.

1.brew update
2.brew install openssl

1

L'ajout gem 'certified', '~> 1.0'à mon Gemfileet l'exécution a bundlerésolu ce problème pour moi.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.