Message d’erreur
state=error: certificate verify failed (self-signed certificate in certificate chain)
Également affiché sous la forme
- OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 peeraddr=127.0.0.1:8443 state=error: certificate verify failed (self-signed certificate in certificate chain)
Le message complet est « SSL_connect returned=1 errno=0 peeraddr=<ip>:<port> state=error: certificate verify failed (self-signed certificate in certificate chain) ». Les Ruby fondés sur OpenSSL 1.1.1 affichent « self signed » sans trait d’union.
Ruby openssl (Net::HTTP, Faraday, RubyGems) — OpenSSL::SSL::SSLError from SSL_connect
Ce que cela signifie
La chaîne du serveur se termine par un certificat racine auto-signé auquel l’OpenSSL de Ruby ne fait pas confiance. Avec des hôtes publics comme rubygems.org, cela signifie qu’un proxy d’inspection TLS ou un antivirus re-signe la connexion ; avec des hôtes internes, la racine de l’entreprise manque dans le magasin qu’utilise Ruby.
Pourquoi cela se produit
Un proxy d’inspection TLS
fréquenteLes proxys d’entreprise re-signent rubygems.org, GitHub et les API avec leur propre racine ; celle-ci est absente du magasin de l’OpenSSL de Ruby.
Un service interne avec une racine privée dans sa chaîne
fréquenteLa racine est envoyée par le serveur, mais n’est pas installée sur le client.
Ruby utilise un autre fichier d’AC que le système
occasionnelleLes Ruby installés avec rbenv/asdf (compilés avec l’OpenSSL de Homebrew) ou avec RubyInstaller sous Windows utilisent leur propre fichier d’AC.
Comment corriger l’erreur
- 1.
Identifier la racine
Affichez la chaîne d’un hôte public ; une racine qui porte le nom de votre entreprise ou d’un éditeur de sécurité est celle à laquelle faire confiance.
bash openssl s_client -connect rubygems.org:443 -servername rubygems.org -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:' - 2.
Faire pointer SSL_CERT_FILE vers un fichier d’AC combiné
Combinez les racines publiques avec la racine du proxy, car SSL_CERT_FILE remplace le fichier d’AC par défaut.
bash # Public roots + the proxy root in one bundle cat /etc/ssl/certs/ca-certificates.crt corp-proxy-root.pem > ~/.config/corp-ca-bundle.pem export SSL_CERT_FILE=~/.config/corp-ca-bundle.pem - 3.
Installer la racine pour tout le système (Linux)
Les Ruby liés à l’OpenSSL du système la prennent en compte après update-ca-certificates.
bash sudo cp corp-proxy-root.pem /usr/local/share/ca-certificates/corp-proxy-root.crt && sudo update-ca-certificates
Erreurs associées
state=error: certificate verify failed (unable to get local issuer certificate)Ruby openssl (Net::HTTP, Faraday, HTTParty, RubyGems)Could not verify the SSL certificate for https://gems.example.com/.Bundlercurl: (60) SSL certificate problem: self-signed certificate in certificate chaincurl (OpenSSL backend)