Message d’erreur
Could not verify the SSL certificate for https://gems.example.com/.
Également affiché sous la forme
- Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for https://gems.example.com/.
À chaque tentative, Bundler affiche « Retrying fetcher due to error (n/4): Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for <source>. », suivi de « There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. » L’URL de la source est celle de votre Gemfile.
Bundler — Bundler::Fetcher::CertificateFailureError while fetching a gem source
Ce que cela signifie
Bundler n’a pas pu vérifier le certificat TLS d’une source de gems du Gemfile ; il a réessayé, puis abandonné. Il enveloppe l’erreur de vérification d’OpenSSL dans Bundler::Fetcher::CertificateFailureError et ajoute une indication selon laquelle le système manque peut-être de certificats d’AC. Comme pour Ruby en général, les AC approuvées sont celles du fichier d’AC de l’OpenSSL qu’utilise ce Ruby, sauf si le paramètre ssl_ca_cert de Bundler en dispose autrement.
Pourquoi cela se produit
Un serveur de gems privé avec un certificat d’entreprise
fréquenteGemfury, Artifactory, Nexus ou un serveur de gems auto-hébergé dont l’AC ne figure pas dans le fichier d’AC qu’utilise Ruby (fréquent dans les images de CI).
Un proxy d’inspection TLS devant rubygems.org
fréquenteLa racine du proxy est approuvée par les navigateurs via le magasin du système d’exploitation, mais pas par le fichier d’AC de l’OpenSSL de Ruby.
Ce Ruby utilise son propre fichier d’AC
occasionnelleLes Ruby compilés avec l’OpenSSL de Homebrew ou avec un OpenSSL embarqué, ainsi que RubyInstaller sous Windows, ne lisent pas le magasin de certificats du système d’exploitation.
Comment corriger l’erreur
- 1.
Définir le paramètre ssl_ca_cert de Bundler
bundle config set ssl_ca_cert indique à Bundler un fichier d’AC pour ses téléchargements. Lors de notre test, cela a immédiatement résolu l’erreur.
bash # Trust a CA for Bundler (stored in .bundle/config; --global for ~/.bundle/config) bundle config set --local ssl_ca_cert /etc/ssl/private-ca/corp-root-ca.pem bundle install - 2.
Ou définir SSL_CERT_FILE
Cette variable d’environnement d’OpenSSL s’applique aussi bien à Bundler qu’à RubyGems et à l’application ; faites-la pointer vers un fichier d’AC qui contient aussi les racines publiques.
bash # Or for the whole process (Bundler, RubyGems and Net::HTTP) SSL_CERT_FILE=/etc/ssl/private-ca/corp-ca-bundle.pem bundle install - 3.
Installer l’AC dans le magasin que lit Ruby
Consultez OpenSSL::X509::DEFAULT_CERT_FILE pour savoir de quel fichier d’AC il s’agit, puis ajoutez-y la racine (sous Debian et Ubuntu, avec update-ca-certificates).
bash sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt && sudo update-ca-certificates ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE' # the bundle this Ruby reads - 4.
RubyGems : le paramètre :ssl_ca_cert dans .gemrc
gem install dispose de son propre paramètre, qui joue le même rôle.
yaml # ~/.gemrc — the same CA for "gem install" :ssl_ca_cert: /etc/ssl/private-ca/corp-root-ca.pem
Erreurs associées
state=error: certificate verify failed (unable to get local issuer certificate)Ruby openssl (Net::HTTP, Faraday, HTTParty, RubyGems)state=error: certificate verify failed (self-signed certificate in certificate…Ruby openssl (Net::HTTP, Faraday, RubyGems)npm error code UNABLE_TO_GET_ISSUER_CERT_LOCALLYnpm (Node.js)There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FA…pip