web-dev-qa-db-fra.com

OpenSSL :: SSL :: SSLError: SSL_connect retourné = 1 errno = 0 état = SSLv3 lire le certificat du serveur B: échec de la vérification du certificat

J'ai utilisé RVM pour installer Ruby 1.9.3 sur Ubuntu 12.04 en faisant

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

Et puis, quand j'essaie de lancer quelque chose dans le sens de:

require 'open-uri'
open('https://www.google.com/')

J'ai l'erreur: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

Comment résoudre ce problème? J'ai beaucoup de threads similaires où les gens ont ce problème dans OSX, mais comment puis-je le résoudre dans Ubuntu?

Merci de votre aide.

16
aren55555

Cela se produit parfois si le "répertoire OpenSSL" par défaut n'est pas défini correctement avec la bibliothèque OpenSSL native. open-uri utilise OpenSSL::X509::Store#set_default_paths afin d'indiquer à OpenSSL de rechercher dans le répertoire OpenSSL le fichier contenant les certificats racine de confiance approuvés par OpenSSL.

Dans votre cas, cette recherche échoue. Vous pouvez y parvenir en définissant une variable d'environnement qui remplace le paramètre par défaut et en ordonnant à OpenSSL de rechercher dans ce répertoire: 

export SSL_CERT_FILE=/etc/pki/tls/cert.pem

C’est l’emplacement par défaut de l’ensemble d’autorités de certification racine sur mon Fedora 16 64 bits. Les autres emplacements populaires sont /etc/ssl/ca-bundle.crt etc. vous devez donc rechercher un candidat approprié pour le fichier d’autorité de certification racine par défaut. Une fois la variable d’environnement définie correctement, l’appel à open-uri aboutira.

Pour rendre la variable d'environnement permanente, utilisez les méthodes habituelles, telles que la définition de l'exportation dans .bashrc,/etc/profile ou tout ce qui convient le mieux à votre situation.

25
emboss

Le fichier cacert.pem est manquant dans OpenSl installé par rvm.

$ cd $rvm_path/usr/ssl
$ Sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ Sudo mv cacert.pem cert.pem
10
Andrei Radulescu

Ajoutez la gemme «certifiée» à votre Gemfile.

Plus d'infos: https://rubygems.org/gems/certified

9
Meekohi

Voir http://jjinux.blogspot.nl/2012/02/Ruby-working-around-ssl-errors-on-os-x.html comme réponse alternative à votre question, cela devrait fonctionner pour Ubuntu Mac OS X et n’exige pas de modification des variables d’environnement.

La solution du lien ci-dessus:

# config/initializers/fix_ssl.rb
# 
# Work around errors that look like:
#
#   SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

require 'open-uri'
require 'net/https'

module Net
  class HTTP
    alias_method :original_use_ssl=, :use_ssl=

    def use_ssl=(flag)
      # Ubuntu
      if File.exists?('/etc/ssl/certs')
        self.ca_path = '/etc/ssl/certs'

      # MacPorts on OS X
      # You'll need to run: Sudo port install curl-ca-bundle
      elsif File.exists?('/opt/local/share/curl/curl-ca-bundle.crt')
        self.ca_file = '/opt/local/share/curl/curl-ca-bundle.crt'
      end

      self.verify_mode = OpenSSL::SSL::VERIFY_PEER
      self.original_use_ssl = flag
    end
  end
end
4
dutchstrider

Vérifiez votre horloge système!

Hit cette erreur sur une machine virtuelle après une longue période (1 semaine) sans utilisation. La mise à jour de mon horloge système a résolu le problème immédiatement.

Si vous utilisez ntpd, ntpdate -b -u pool.ntp.org le fera pour vous.

0
Gavin Miller

Cela a maintenant fonctionné pour moi. Les choses ont commencé à fonctionner quand j'ai lancé "brassage de médecin", ce qui m'a conduit à des indices comme "unset SSL_CERT_DIR"

0
Kim Miller