Fehlermeldung
state=error: certificate verify failed (self-signed certificate in certificate chain)
Auch ausgegeben als
- 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)
Die vollständige Meldung lautet „SSL_connect returned=1 errno=0 peeraddr=<ip>:<port> state=error: certificate verify failed (self-signed certificate in certificate chain)“. Ruby-Versionen auf Basis von OpenSSL 1.1.1 geben „self signed“ ohne Bindestrich aus.
Ruby openssl (Net::HTTP, Faraday, RubyGems) — OpenSSL::SSL::SSLError from SSL_connect
Was der Fehler bedeutet
Die Kette des Servers endet in einem selbstsignierten Root-Zertifikat, dem das OpenSSL von Ruby nicht vertraut. Bei öffentlichen Hosts wie rubygems.org bedeutet das, dass ein Proxy mit TLS-Inspektion oder ein Virenscanner die Verbindung neu signiert; bei internen Hosts fehlt das Root-Zertifikat der Firma in dem Zertifikatsspeicher, den Ruby verwendet.
Warum der Fehler auftritt
Ein Proxy mit TLS-Inspektion
häufigFirmen-Proxys signieren rubygems.org, GitHub und APIs mit ihrem eigenen Root-Zertifikat neu; im OpenSSL-Zertifikatsspeicher von Ruby fehlt es.
Ein interner Dienst mit einem privaten Root-Zertifikat in seiner Kette
häufigDer Server sendet das Root-Zertifikat mit, aber auf dem Client ist es nicht installiert.
Ruby verwendet ein anderes Bundle als das System
gelegentlichRuby-Versionen, die mit rbenv/asdf gegen das OpenSSL von Homebrew installiert wurden, oder RubyInstaller unter Windows verwenden ein eigenes CA-Bundle.
So behebst du den Fehler
- 1.
Root-Zertifikat identifizieren
Gib die Kette für einen öffentlichen Host aus; ein Root-Zertifikat, das nach deiner Firma oder einem Sicherheitsanbieter benannt ist, ist das, dem du vertrauen musst.
bash openssl s_client -connect rubygems.org:443 -servername rubygems.org -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:' - 2.
SSL_CERT_FILE auf ein kombiniertes Bundle zeigen lassen
Kombiniere die öffentlichen Root-Zertifikate mit dem Root-Zertifikat des Proxys, denn SSL_CERT_FILE ersetzt das Standard-Bundle.
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.
Root-Zertifikat systemweit installieren (Linux)
Ruby-Versionen, die gegen das OpenSSL des Systems gelinkt sind, übernehmen das Root-Zertifikat nach einem Lauf von update-ca-certificates.
bash sudo cp corp-proxy-root.pem /usr/local/share/ca-certificates/corp-proxy-root.crt && sudo update-ca-certificates
Verwandte Fehler
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)