Wie kann das Ablaufdatum des SSL-Zertifikats anhand eines PEM-codierten Zertifikats ermittelt werden?

326

Wenn ich die eigentliche Datei und eine Bash-Shell unter Mac oder Linux habe, wie kann ich die Zertifizierungsdatei abfragen, wann sie abläuft? Keine Website, sondern die Zertifikatdatei selbst, vorausgesetzt, ich habe die Dateien csr, key, pem und chain.

GL2014
quelle

Antworten:

628

Mit openssl:

openssl x509 -enddate -noout -in file.pem

Die Ausgabe erfolgt auf dem Formular:

notAfter=Nov  3 22:23:50 2014 GMT

Siehe auch MikeW Antwort dafür , wie leicht zu überprüfen , ob das Zertifikat abgelaufen ist oder nicht, oder ob sie in einem bestimmten Zeitraum, ohne dass das oben genannte Datum zu analysieren.

dieser andere Typ
quelle
19
Sie haben auch die -startdateund -enddateOptionen in das eingebaute x509Dienstprogramm. Sie werden dir das retten grep.
Jww
2
Dies funktioniert auch, wenn die Datei nicht im PEM-Format vorliegt. funktioniert gut für server.crt
schauen Sie am
163

Wenn Sie nur wissen möchten, ob das Zertifikat abgelaufen ist (oder dies innerhalb der nächsten N Sekunden tun wird), können Sie mit der folgenden -checkend <seconds>Option openssl x509Folgendes mitteilen:

if openssl x509 -checkend 86400 -noout -in file.pem
then
  echo "Certificate is good for another day!"
else
  echo "Certificate has expired or will do so within 24 hours!"
  echo "(or is invalid/not found)"
fi

Dies erspart es, Datums- / Zeitvergleiche selbst durchführen zu müssen.

opensslgibt einen Exit-Code von 0(Null) zurück, wenn das Zertifikat nicht abgelaufen ist und dies für die nächsten 86400 Sekunden im obigen Beispiel nicht tun wird. Wenn das Zertifikat abgelaufen ist oder dies bereits getan hat - oder ein anderer Fehler wie eine ungültige / nicht vorhandene Datei - lautet der Rückkehrcode 1.

(Natürlich wird davon ausgegangen, dass Uhrzeit / Datum korrekt eingestellt sind.)

MikeW
quelle
8
Verwenden Sie eine Dauer von null Sekunden, um festzustellen, ob ein Zertifikat derzeit abgelaufen ist. Lassen Sie die -nooutOption aus, um eine hilfreiche Nachricht mit einem einzigen Befehl ohne zusätzliche Logik anzuzeigen. Gibt beispielsweise openssl x509 -checkend 0 -in file.pemdie Ausgabe "Zertifikat läuft ab" oder "Zertifikat läuft nicht ab" aus und gibt an, ob das Zertifikat in null Sekunden abläuft.
LS
1
Vielen Dank! Genau das brauchte ich! Mit den Exit-Codes wird ein viel kleineres / saubereres Programm erstellt.
Lon Kaut
24

Hier ist meine Bash-Befehlszeile, um mehrere Zertifikate in der Reihenfolge ihres Ablaufs aufzulisten, die zuletzt zuerst abläuft.

for pem in /etc/ssl/certs/*.pem; do 
   printf '%s: %s\n' \
      "$(date --date="$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" --iso-8601)" \
      "$pem"
done | sort

Beispielausgabe:

2015-12-16: /etc/ssl/certs/Staat_der_Nederlanden_Root_CA.pem
2016-03-22: /etc/ssl/certs/CA_Disig.pem
2016-08-14: /etc/ssl/certs/EBG_Elektronik_Sertifika_Hizmet_S.pem
Nicholas Sushkin
quelle
Sehr schön! Das war es, wonach ich gesucht habe. Jetzt habe ich einen Überblick über die Zertifikate, die ich bald erneuern muss. Es wurde als checkcerts.sh in meinem Home-Ordner gespeichert, damit ich es regelmäßig überprüfen kann. Als nächstes müsste ein CRON-Job jeden Monat überprüft und die zu erneuernden Zertifikate per E-Mail gesendet werden.
Pete
3
Sehr nützlich, danke. Ich benutze diesen Cronjob0 7 * * 1 /path/to/cert.sh | mail -s "certbot" [email protected]
Matthieu
10

Hier ist eine Bash-Funktion, die alle Ihre Server überprüft, vorausgesetzt, Sie verwenden DNS-Round-Robin. Beachten Sie, dass dies ein GNU-Datum erfordert und unter Mac OS nicht funktioniert

function check_certs () {
  if [ -z "$1" ]
  then
    echo "domain name missing"
    exit 1
  fi
  name="$1"
  shift

  now_epoch=$( date +%s )

  dig +noall +answer $name | while read _ _ _ _ ip;
  do
    echo -n "$ip:"
    expiry_date=$( echo | openssl s_client -showcerts -servername $name -connect $ip:443 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2 )
    echo -n " $expiry_date";
    expiry_epoch=$( date -d "$expiry_date" +%s )
    expiry_days="$(( ($expiry_epoch - $now_epoch) / (3600 * 24) ))"
    echo "    $expiry_days days"
  done
}

Ausgabebeispiel:

$ check_certs stackoverflow.com
151.101.1.69: Aug 14 12:00:00 2019 GMT    603 days
151.101.65.69: Aug 14 12:00:00 2019 GMT    603 days
151.101.129.69: Aug 14 12:00:00 2019 GMT    603 days
151.101.193.69: Aug 14 12:00:00 2019 GMT    603 days
Andrew
quelle
überraschenderweise läuft osx 10.13.4 Ihre Shell in Ordnung (beurteilen Sie mich nicht, ich bin heute nur auf osx, um eine App in den App Store zu schieben ... booten Sie in Kürze zurück zu Linux ;-)
Scott Stensland
1
@ScottStensland Wir beurteilen :-P. Ich benutze viel Mac, aber Linux ist wirklich viel besser.
Mike Q
Vielen Dank für diesen Code-Snippit! Was für eine nervige Aufgabe :), ich wünschte, es gäbe ein Unixtime-Zeitstempel-Flag für openssl.
user1279741
1
Für diejenigen von Ihnen, die sich in einem alpinen Linux-Container befinden, muss für Ihren expiry_dateWert der Zeitzonenname am Ende entfernt werden. Fügen Sie cutdazu am Ende der Pipe eine zusätzliche hinzu :| cut -d ' ' -f 1-4
Droogans
5

Eine Zeile prüft auf wahr / falsch, ob das Domain-Zertifikat einige Zeit später (z. B. 15 Tage) abgelaufen ist:

if openssl x509 -checkend $(( 24*3600*15 )) -noout -in <(openssl s_client -showcerts -connect may.domain.com:443 </dev/null 2>/dev/null | openssl x509 -outform PEM)
then
  echo 'good'
else
  echo 'bad'
fi
Alexey
quelle
2

Für MAC OSX (El Capitan) Diese Modifikation von Nicholas 'Beispiel hat bei mir funktioniert.

for pem in /path/to/certs/*.pem; do
    printf '%s: %s\n' \
        "$(date -jf "%b %e %H:%M:%S %Y %Z" "$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" +"%Y-%m-%d")" \
    "$pem";
done | sort

Beispielausgabe:

2014-12-19: /path/to/certs/MDM_Certificate.pem
2015-11-13: /path/to/certs/MDM_AirWatch_Certificate.pem

macOS mochte das nicht --date= oder --iso-8601Flags auf meinem System nicht.

Donald.M
quelle
Wie würden Sie dies tun, wenn Sie die .pem-Dateien nicht erstellt hätten, sondern nur .cerZertifikate hätten, die Sie gerade erstellt und von der Apple Dev-Website heruntergeladen haben?
Alex Zavatone
1

Entspricht der akzeptierten Antwort. Beachten Sie jedoch, dass dies auch mit .crtDateien und nicht nur mit Dateien funktioniert .pem, nur für den Fall, dass Sie den .pemSpeicherort der Datei nicht finden können .

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

Ergebnis:

notAfter=Mar 29 06:15:00 2020 GMT
Srihari Karanth
quelle
0

Wenn Sie (aus irgendeinem Grund) eine GUI-Anwendung unter Linux verwenden möchten, verwenden Sie gcr-viewer (in den meisten Distributionen wird sie vom Paket installiert gcr(ansonsten im Paket gcr-viewer)).

gcr-viewer file.pem
# or
gcr-viewer file.crt
Attila123
quelle