Fehlermeldung
curl: (60) SSL: no alternative certificate subject name matches target hostname 'api.example.com'
Auch ausgegeben als
- curl: (60) SSL: no alternative certificate subject name matches target host name 'api.example.com'
curl 8.x gibt „target hostname“ aus; curl 7.x schrieb „target host name“. Der Host in Anführungszeichen ist genau das, was in der URL stand. Sehr alte curl-Versionen (vor 7.62.0) verwendeten für diese Prüfung den Exit-Code 51.
curl (OpenSSL backend) — CURLE_PEER_FAILED_VERIFICATION, hostname check in lib/vtls/openssl.c
Was der Fehler bedeutet
Die Zertifikatskette ist vertrauenswürdig, aber keiner der DNS-Namen (und keine der IP-Adressen) in der Erweiterung Subject Alternative Name des Zertifikats passt zum Host in der URL. curl vergleicht den Host der URL nur mit den SAN-Einträgen; der Common Name im Subject wird ignoriert, sobald eine SAN-Erweiterung vorhanden ist. Der Name in Anführungszeichen am Ende ist der Host, den curl erreichen sollte.
Warum der Fehler auftritt
Das Zertifikat führt diesen Namen nicht auf
häufigEin Zertifikat für example.com deckt www.example.com und api.example.com nur ab, wenn jeder dieser Namen in der SAN-Liste steht. Neue Subdomains und neue Umgebungen (staging, eu.) brauchen ein neu ausgestelltes Zertifikat.
Die URL verwendet eine IP-Adresse, localhost oder einen internen Alias
häufighttps://10.0.0.5, https://localhost oder der Name eines docker-compose-Dienstes erreichen den richtigen Server, fragen aber nach einem Namen, für den das Zertifikat nie ausgestellt wurde. IP-Adressen passen nur zu IP-SAN-Einträgen, nie zu DNS-Einträgen.
Der Server hat das Zertifikat einer anderen Website geliefert
gelegentlichAuf gemeinsam genutzten IP-Adressen wird das Zertifikat per SNI ausgewählt. Gibt es für den angefragten Namen keinen passenden Server-Block, antwortet der Server mit seinem Standardzertifikat, das auf eine andere Website lautet.
Eine Wildcard soll mehr abdecken, als sie kann
gelegentlich*.example.com deckt api.example.com ab, aber weder example.com noch v2.api.example.com: Eine Wildcard steht für genau ein Label.
So behebst du den Fehler
- 1.
SAN-Liste mit der URL vergleichen
Gib die Erweiterung subjectAltName des ausgelieferten Zertifikats aus. Die Lösung ist entweder ein Zertifikat, das den Namen aufführt, oder eine URL, die einen der aufgeführten Namen verwendet.
bash # Names the served certificate actually covers echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -subject -ext subjectAltName - 2.
Zertifikat mit allen verwendeten Namen neu ausstellen
Beantrage alle Hostnamen (und IP-Adressen, falls sich Clients per IP verbinden) als SAN-Einträge. Steht der Name nur im Common Name, funktioniert das mit keinem aktuellen Client.
bash # ACME: list every name the certificate must cover sudo certbot certonly --nginx -d example.com -d www.example.com -d api.example.com # Private CA: put all names into subjectAltName (CN is ignored for matching) openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com,DNS:www.example.com,IP:10.0.0.5" - 3.
Namen beibehalten, nur die Adresse ändern
Musst du eine bestimmte Adresse erreichen (einen Knoten des Load Balancers, einen Tunnel, eine Staging-IP), behalten --resolve oder --connect-to den Host der URL bei, sodass SNI und die Hostnamenprüfung weiterhin den Namen aus dem Zertifikat verwenden.
bash # Keep the certificate's name in the URL and steer the connection to another address curl --resolve api.example.com:443:10.0.0.5 https://api.example.com/ curl --connect-to api.example.com:443:lb-internal.example.net:443 https://api.example.com/ - 4.
Eigener Server: SNI-Routing prüfen
Unterscheidet sich das Zertifikat zwischen Anfragen mit und ohne SNI, lege für den Namen einen Server-Block (oder eine Ingress-Regel) an und stelle sicher, dass Clients für echte Hostnamen nicht das Standardzertifikat erhalten.
bash # Compare what the server returns with and without SNI openssl s_client -connect 10.0.0.5:443 -servername api.example.com </dev/null 2>/dev/null | openssl x509 -noout -subject openssl s_client -connect 10.0.0.5:443 -noservername </dev/null 2>/dev/null | openssl x509 -noout -subject
Verwandte Fehler
x509: certificate is valid for example.com, not api.example.comGo crypto/x509Hostname/IP does not match certificate's altnames: Host: api.example.com. is no…Node.js tls.checkServerIdentity()[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch,…Python ssl module (OpenSSL host check)No subject alternative DNS name matching api.example.com found.Java (JSSE HostnameChecker)fatal: unable to access 'https://git.example.com/team/app.git/': SSL: certifica…git over HTTPS with libcurl-gnutls (Debian, Ubuntu)