Fehlermeldung
curl: (60) SSL certificate problem: certificate has expired
Auch ausgegeben als
- curl: (60) SSL certificate OpenSSL verify result: certificate has expired (10)
Der Text des Grundes ist in curl-Builds mit OpenSSL 1.1.1, 3.0 und 3.5 identisch. Neuere curl-Releases (in unserem Test 8.22.0) formulieren ihn als „SSL certificate OpenSSL verify result: certificate has expired (10)“. Zertifikate, die noch nicht gültig sind, erzeugen einen anderen Grund: „certificate is not yet valid“.
curl (OpenSSL backend) — CURLE_PEER_FAILED_VERIFICATION, X509_V_ERR_CERT_HAS_EXPIRED (10)
Was der Fehler bedeutet
Ein Zertifikat in der Kette, die curl aufgebaut hat, hat in notAfter ein Datum, das vor der aktuellen Uhrzeit des Rechners liegt, auf dem curl läuft. Meist ist es das eigene Zertifikat des Servers, aber ein abgelaufenes Zwischenzertifikat oder ein cross-signiertes Root-Zertifikat erzeugt denselben Text. Geprüft wird gegen die lokale Uhr, deshalb sieht eine falsch gehende Uhr genauso aus wie ein abgelaufenes Zertifikat.
Warum der Fehler auftritt
Die automatische Erneuerung funktioniert nicht mehr
häufigcertbot-Timer, die nie aktiviert wurden, ACME-Challenges, die hinter einem CDN oder einer Firewall inzwischen scheitern, ein abgelaufenes Token für die DNS-API oder ein manueller Prozess, für den niemand zuständig ist. Die Laufzeiten öffentlicher Zertifikate schrumpfen auf 200 Tage im Jahr 2026 und 47 Tage bis 2029, deshalb fallen unbemerkt fehlgeschlagene Erneuerungen schnell auf.
Das Zertifikat wurde erneuert, aber der Server liefert noch das alte aus
häufignginx, HAProxy, Postfix und Java-Server laden das Zertifikat beim Start. Eine erneuerte Datei auf der Festplatte ändert nichts, bis der Prozess neu lädt; Load Balancer und CDNs behalten ihre eigene hochgeladene Kopie.
Ein Zwischenzertifikat oder ein cross-signiertes Zertifikat in der ausgelieferten Kette ist abgelaufen
gelegentlichEin Server, der ein altes Zwischenzertifikat mitliefert (zum Beispiel ein cross-signiertes aus einer veralteten Fullchain-Datei), kann Clients dazu bringen, einen Pfad über ein abgelaufenes Zertifikat aufzubauen, obwohl das Leaf-Zertifikat aktuell ist. Der Ablauf des Cross-Signings durch DST Root CA X3 im Jahr 2021 hat auf diese Weise viele ältere Clients lahmgelegt.
Die Uhr des Clients geht falsch
gelegentlichGeräte ohne batteriegepufferte Uhr, aus Snapshots wiederhergestellte VMs und Container auf einem Host, dessen Uhr abdriftet, können um Monate danebenliegen. Scheitern alle HTTPS-Websites auf einmal, prüfe vor allem anderen das Datum.
Ein alter Client baut den Pfad zu einem abgelaufenen Root-Zertifikat auf
seltenClients mit einem veralteten CA-Bundle kennen womöglich nur eine abgelaufene Version eines Root-Zertifikats und scheitern, obwohl moderne Clients einen neueren Pfad wählen. Ein Update von ca-certificates behebt das.
So behebst du den Fehler
- 1.
Herausfinden, welches Zertifikat abgelaufen ist
Gib für jedes Zertifikat, das der Server sendet, das Datum in notAfter aus. Ist das Leaf-Zertifikat abgelaufen, erneuere es; ist es ein Zwischenzertifikat, ersetze die Kettendatei durch die, die deine CA aktuell veröffentlicht.
bash # Split the served chain into cert1.pem (leaf), cert2.pem, ... and print each expiry date openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \ | awk '/BEGIN CERT/{n++; f="cert" n ".pem"} /BEGIN CERT/,/END CERT/{print > f}' for f in cert*.pem; do openssl x509 -in "$f" -noout -subject -enddate; done - 2.
Erneuern, neu laden und prüfen, was tatsächlich ausgeliefert wird
Lade nach der Erneuerung jeden Prozess und jedes Gerät neu, das TLS für den Namen terminiert, und prüfe das Datum dann von der Netzwerkseite aus statt anhand der Datei auf der Festplatte.
bash sudo certbot renew # or your ACME client / CA portal sudo systemctl reload nginx # the server keeps serving the old file until reloaded echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -enddate # confirm the new date is what the network sees - 3.
Uhr des Clients korrigieren
Ist das Zertifikat auf anderen Rechnern in Ordnung, synchronisiere die Uhrzeit des betroffenen Rechners per NTP. In Containern kommt die Uhr vom Host, also korrigiere sie dort.
bash date -u # compare with the real UTC time timedatectl status # "System clock synchronized: yes"? sudo timedatectl set-ntp true - 4.
CA-Bundle des Clients aktualisieren
Auf langlebigen Systemen entfernt ein aktualisiertes Paket ca-certificates ausgemusterte Root-Zertifikate und fügt aktuelle hinzu, sodass OpenSSL einen gültigen Pfad statt eines abgelaufenen wählen kann.
bash # Old clients: refresh the root store so they stop building paths through retired roots sudo apt-get update && sudo apt-get install --only-upgrade ca-certificates # Debian/Ubuntu sudo dnf upgrade ca-certificates # RHEL/Fedora
Verwandte Fehler
verify error:num=10:certificate has expiredOpenSSL CLI (openssl s_client / openssl verify)x509: certificate has expired or is not yet valid: current time 2026-08-20T15:4…Go crypto/x509certificate has expiredNode.js tls / https / fetch[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has exp…Python ssl module (OpenSSL)curl: (60) SSL certificate problem: unable to get local issuer certificatecurl (OpenSSL backend)