Fehlermeldung
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired
Identischer Wortlaut in Python mit OpenSSL 1.1.1, 3.0 und 3.5, gefolgt von einer Quellcode-Position wie „(_ssl.c:1082)“. Ein Zertifikat, dessen Gültigkeit noch nicht begonnen hat, führt zu „certificate is not yet valid“.
Python ssl module (OpenSSL) — ssl.SSLCertVerificationError, X509_V_ERR_CERT_HAS_EXPIRED (10)
Was der Fehler bedeutet
OpenSSL hat in der Kette ein Zertifikat gefunden, dessen Gültigkeit vor der aktuellen Zeit dieses Rechners endete. Meist wurde das Zertifikat des Servers nicht erneuert, oder das erneuerte wird nicht ausgeliefert; manchmal baut der Client den Pfad über ein abgelaufenes Root-Zertifikat aus einem veralteten CA-Bundle, oder seine Uhr geht falsch.
Warum der Fehler auftritt
Das Zertifikat des Servers (oder ein Zwischenzertifikat) ist abgelaufen
häufigDie Erneuerung ist nicht gelaufen, oder sie lief, aber der Dienst wurde nicht neu geladen. Prüfe den Gültigkeitszeitraum des tatsächlich ausgelieferten Zertifikats, bevor du am Client etwas änderst.
Ein veraltetes certifi- oder System-Bundle
gelegentlichUmgebungen, die auf ein altes certifi-Release festgelegt sind (oder alte Betriebssystem-Images), kennen unter Umständen nur abgelaufene Versionen von Root-Zertifikaten und bauen einen abgelaufenen Pfad, während aktuelle Clients erfolgreich sind. Genau das hat viele Python-Clients lahmgelegt, als 2021 das Cross-Signing durch DST Root CA X3 ablief.
Die Uhr des Clients geht falsch
gelegentlichEine VM oder ein Container-Host, dessen Uhr in der Zukunft steht, lässt gültige Zertifikate abgelaufen erscheinen. Scheitern alle Websites auf einmal, prüfe zuerst die Uhrzeit.
So behebst du den Fehler
- 1.
Ausgeliefertes Zertifikat ansehen
Rufe das Zertifikat einmal mit abgeschalteter Prüfung ab, nur um es zu lesen, und prüfe notAfter (füge es in den Decoder ein). Verwende diese ungeprüfte Verbindung für nichts anderes.
python import socket, ssl # Read the served certificate without verifying it, to see its dates ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE with socket.create_connection(("api.example.com", 443)) as raw: with ctx.wrap_socket(raw, server_hostname="api.example.com") as tls: der = tls.getpeercert(binary_form=True) print(ssl.DER_cert_to_PEM_cert(der)) # paste into a certificate decoder - 2.
certifi oder das Bundle des Betriebssystems aktualisieren
Ist das Zertifikat des Servers selbst in Ordnung, aktualisiere die Root-Zertifikate des Clients: pip install --upgrade certifi für Bibliotheken, die certifi verwenden, das Paket ca-certificates für das System-Bundle.
bash python3 -m pip install --upgrade certifi python3 -c "import certifi; print(certifi.__version__, certifi.where())" - 3.
Systemuhr korrigieren
Aktiviere NTP auf dem Client (bei Containern auf dem Host).
bash date -u sudo timedatectl set-ntp true
Verwandte Fehler
curl: (60) SSL certificate problem: certificate has expiredcurl (OpenSSL backend)x509: certificate has expired or is not yet valid: current time 2026-08-20T15:4…Go crypto/x509certificate has expiredNode.js tls / https / fetchverify error:num=10:certificate has expiredOpenSSL CLI (openssl s_client / openssl verify)