web-dev-qa-db-fra.com

Erreur OpenSSL "vérification du certificat" lors de l'utilisation de Ruby 1.9.3

J'utilise Ruby 1.9.3p0 sur Mac OS 10.6.8 (installé à l'aide de rvm). Lorsque je tente de créer une nouvelle application Rails à l'aide d'un modèle d'application hébergé sur GitHub , avec ceci (par exemple):

 $ Rails new myapp -m https://github.com/RailsApps/Rails3-application-templates/raw/master/Rails3-mongoid-devise-template.rb -T -O 

Je reçois ce message d'erreur:

/Users/me/.rvm/rubies/Ruby-1.9.3-p0/lib/Ruby/1.9.1/net/http.rb:799:in `connect ': SSL_connect 
 Retourné = 1 errno = 0 state = certificat de serveur de lecture SSLv3 B: échec de la vérification du certificat 
 (OpenSSL :: SSL :: SSLError) 

Je comprends que l’interprète de langage Ruby utilise OpenSSL pour se connecter à GitHub afin de demander le fichier de modèle d’application. GitHub exige que toutes les connexions soient établies en utilisant SSL. La connexion a échoué car OpenSSL n'a pas pu vérifier le certificat du serveur.

J'ai pu résoudre le problème en téléchargeant un fichier de certificats:

Sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ Sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ Sudo mv cacert.pem cert.pem 

Je n'ai eu aucun problème en utilisant Ruby 1.9.2. Pourquoi ai-je eu le problème de "vérification du certificat a échoué" pour Ruby 1.9.3? Est-ce un bug de Ruby 1.9.3? Est-ce spécifique à Mac OS 10.6.8? Est-ce que ma solution est la bonne façon de résoudre ce problème?

18
Daniel Kehoe

Il y a beaucoup de pièces mobiles impliquées dans la bonne réponse. Dépend de votre système d'exploitation, version Ruby, version OpenSSL, version Rubygems. J'ai fini par écrire un article après une recherche. Mon article explique les raisons de l'erreur, propose des étapes pour un diagnostic plus approfondi, présente plusieurs solutions de contournement et suggère des solutions possibles. Ce sera utile:

Erreurs et Rails OpenSSL - Echec de la vérification du certificat

Il existe également des liens vers les commits et problèmes pertinents sur GitHub.

21
Daniel Kehoe

Pour moi, cela s'est produit sous OS X avec homebrew après la mise à jour vers la dernière version de RVM (résolution 1.20.12), puis l'installation de Ruby-1.9.3-p429. Je pourrais reproduire le problème simplement en lançant:

$ rvm use Ruby-1.9.3-p429
$ irb
1.9.3p429 :001 > require 'open-uri'; open 'https://google.com'
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/net/http.rb:800:in `connect'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/net/http.rb:800:in `block in connect'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/timeout.rb:55:in `timeout'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/timeout.rb:100:in `timeout'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/net/http.rb:800:in `connect'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/net/http.rb:756:in `do_start'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/net/http.rb:745:in `start'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:306:in `open_http'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:775:in `buffer_open'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:203:in `block in open_loop'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:201:in `catch'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:201:in `open_loop'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:146:in `open_uri'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:677:in `open'
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/lib/Ruby/1.9.1/open-uri.rb:33:in `open'
    from (irb):1
    from /Users/lyahdav/.rvm/rubies/Ruby-1.9.3-p429/bin/irb:16:in `<main>'1.9.3p429 :002 > 

La solution était semblable à celle de la question, mais le chemin était mauvais. Courir cela a corrigé:

curl https://curl.haxx.se/ca/cacert.pem -o /usr/local/etc/openssl/cert.pem

L’indice concernant le bon chemin était que lors de l’installation de Ruby-1.9.3-p429 via RVM, cela était indiqué dans la sortie:

Certificates in '/usr/local/etc/openssl/cert.pem' already are up to date.

J'avais le chemin /usr/local/etc/openssl, mais aucun fichier cert.pem dans ce répertoire, je ne sais donc pas pourquoi RVM a prétendu que les certificats étaient à jour. Ce serait bien de savoir pourquoi je devais le faire en premier lieu, mais je n'ai pas le temps d'enquêter pour le moment.

13
Liron Yahdav

J'ai eu le même problème, ayant compilé mon RVM Ruby contre une installation RVM d'OpenSSL. J'ai déplacé le fichier cacerts.pem tel que téléchargé par l'affiche originale sous ~/.rvm/usr/ssl/cert.pem pour que le problème disparaisse. 

11
Sander Temme

J'avais le même problème.

J'ai finalement résolu le problème en mettant à niveau ma version d'OpenSSL que j'avais installée via MacPorts. J'utilisais une version d'OpenSSL à partir de 2009, j'ai donc mis à niveau mon installation MacPorts, puis mon installation OpenSSL via l'interface de ligne de commande ports.

Il doit y avoir une certaine intégration entre Ruby/Rails et OpenSSL sur des installations Mac qui va sans dire. Dans mon cas, j'avais des problèmes pour obtenir le Connexion avec Facebook pour fonctionner correctement lorsque Facebook renvoyait le jeton oAuth/Login à mon application, Devise & OmniAuth devait avoir besoin d'un certificat SSL valide pour graph.facebook.com qui n'était pas présent. mon ancienne version d'OpenSSL.

2
Robert Brown

Le répertoire de certification Openssl est /usr/lib/ssl/ dans Debian. Donc, suivre trois lignes me suffisait,

$ cd /usr/lib/ssl/
$ Sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ Sudo mv cacert.pem cert.pem
1
seyyah

Cela pourrait être dû à la façon dont vous avez construit 1.9.2 et 1.9.3 - quel que soit l'outil que vous utilisiez pour construire chaque chose configurée de manière légèrement différente. Ou peut-être qu'ils utilisent différentes versions d'OpenSSL.

Voici le seul changement potentiellement pertinent que j'ai pu remarquer sur Net: HTTP entre 1.9.2 et 1.9.3

 require 'net/protocol'
-autoload :OpenSSL, 'openssl'
 require 'uri'
+autoload :OpenSSL, 'openssl'

(si vous voulez voir le diff ...)

 clone git https://github.com/Ruby/ruby.git
cd Ruby 
 git diff Origine/Ruby_1_9_2 Origine/Ruby_1_9_3 - http.rb 
0
John Bachir

J'ai eu un problème similaire, mais pas sur Rails, mais uniquement sur Ruby sous Windows. Je l'ai résolu en utilisant cacert.pem certificate et en définissant l'emplacement du certificat sur la variable d'environnement "SSL_CERT_FILE".

Réponse détaillée ici: https://stackoverflow.com/a/35429863/4747587

0
Henry