Fehlermeldung
state=error: certificate verify failed (hostname mismatch)
Auch ausgegeben als
- OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 peeraddr=127.0.0.1:8443 state=error: certificate verify failed (hostname mismatch)
Vollständige Meldung: „SSL_connect returned=1 errno=0 peeraddr=<ip>:<port> state=error: certificate verify failed (hostname mismatch)“. Der Hostname selbst ist nicht Teil der Meldung; vergleiche die URL mit dem Zertifikat.
Ruby openssl (Net::HTTP verify_hostname, default true) — OpenSSL::SSL::SSLError from SSL_connect
Was der Fehler bedeutet
Die Kette ist vertrauenswürdig, aber der Hostname, mit dem sich Net::HTTP verbunden hat, steht nicht in den Subject Alternative Names des Zertifikats. Aktuelle Ruby-Versionen lassen OpenSSL den Hostnamen während des Handshakes prüfen (verify_hostname), deshalb zeigt sich das Problem als fehlgeschlagene Zertifikatsprüfung; ältere Ruby-Versionen lösten nach dem Verbindungsaufbau einen separaten Fehler „hostname … does not match the server certificate“ aus.
Warum der Fehler auftritt
Das Zertifikat deckt diesen Namen nicht ab
häufigSubdomains, die Apex-Domain oder umbenannte Hosts, die in der SAN-Liste fehlen.
Verbindung per IP oder über einen internen Alias
häufigDatenbank-, Redis- oder API-Clients, die mit IP-Adressen oder Containernamen konfiguriert sind.
Der Server hat sein Standardzertifikat geliefert
gelegentlichEin Proxy, der den angefragten Namen nicht kennt, liefert das Zertifikat einer anderen Website aus.
So behebst du den Fehler
- 1.
SAN-Liste mit dem Host vergleichen
Die Meldung enthält die Namen nicht, gib sie deshalb aus dem Zertifikat aus.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -ext subjectAltName - 2.
Namen des Zertifikats verwenden und Adresse fest vorgeben
Net::HTTP#ipaddr= verbindet sich mit einer vorgegebenen IP, während SNI und Prüfung den Hostnamen verwenden.
ruby # Connect to a specific address but verify the certificate's name (Net::HTTP#ipaddr=) http = Net::HTTP.new("www.example.com", 443) http.ipaddr = "10.0.0.5" http.use_ssl = true http.get("/health") - 3.
Mit allen verwendeten Namen neu ausstellen
Nimm die fehlenden Namen in subjectAltName auf.
bash openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com,DNS:www.example.com"