So sieht die Meldung aus
curl: (60) SSL certificate problem: unable to get local issuer certificateHäufige Ursachen
- Server liefert nur das eigene Zertifikat, nicht die Kette (
cert.pemstattfullchain.pem). - CA-Bundle auf dem Client fehlt oder ist veraltet (Paket
ca-certificates). - Python auf macOS ohne installierte Zertifikate oder ein venv mit eigenem
certifi. - Firmen-Proxy mit TLS-Inspection ersetzt Zertifikate durch eine interne CA.
- Interne oder private CA, die nur auf einigen Rechnern installiert ist.
Prüfen
- Gesendete Kette anzeigen: Subjekt und Aussteller jedes Zertifikats
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null 2>/dev/null | grep -E '^ *[0-9] s:|^ *i:' - Fehlerdetails von curl anzeigen
curl -vI https://example.com 2>&1 | grep -iE 'issuer|verify|SSL certificate' - CA-Pfade von Python anzeigen
python3 -c 'import ssl; print(ssl.get_default_verify_paths())' - Prüfen, ob das System-CA-Bundle vorhanden ist
openssl x509 -in /etc/ssl/certs/ca-certificates.crt -noout -subject 2>/dev/null | head -n 1
Lösung
- Auf dem Server die volle Kette ausliefern: nginx
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;. - Auf dem Client CA-Bundle aktualisieren:
apt install --reinstall ca-certificates && update-ca-certificates. - Private CA ins System übernehmen: Datei nach
/usr/local/share/ca-certificates/kopieren undupdate-ca-certificatesausführen. - Bei TLS-Inspection die Firmen-CA im Client hinterlegen, z. B. über
REQUESTS_CA_BUNDLEoderNODE_EXTRA_CA_CERTS. - Nie dauerhaft
curl -koderverify=Falsenutzen – damit ist TLS wertlos.
Häufige Fragen
Warum geht es im Browser, aber nicht mit curl?
Browser laden fehlende Zwischenzertifikate oft selbst nach oder haben sie im Cache. curl und Python tun das nicht und zeigen das Problem ehrlich.
Wie erkenne ich eine fehlende Kette?
In der Ausgabe von openssl s_client -showcerts steht nur ein Zertifikat (0 s:…). Bei korrekter Kette folgt mindestens ein Zwischenzertifikat (1 s:…).