Zum Inhalt springen
ecdsa.com
curl (OpenSSL backend)curl

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

So behebst du den Fehler

  1. 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. 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. 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. 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

Gesamte Signaturfehler-Datenbank durchsuchen