536 Stimmen

Wie lässt sich das Ablaufdatum eines SSL-Zertifikats aus einem im PEM-Format codierten Zertifikat bestimmen?

Wenn ich die tatsächliche Datei und eine Bash-Shell in Mac oder Linux habe, wie kann ich die Zertifikatsdatei abfragen, um herauszufinden, wann sie abläuft? Nicht eine Website, sondern tatsächlich die Zertifikatsdatei selbst, vorausgesetzt ich habe die CSR-, Schlüssel-, PEM- und Ketten-Dateien.

981voto

that other guy Punkte 110833

Mit openssl:

openssl x509 -enddate -noout -in file.pem

Die Ausgabe erfolgt in folgendem Format:

notAfter=Nov 3 22:23:50 2014 GMT

Siehe auch Mikes Antwort, um einfach zu überprüfen, ob das Zertifikat abgelaufen ist oder nicht oder ob es innerhalb eines bestimmten Zeitraums ablaufen wird, ohne das Datum oben parsen zu müssen.

229voto

MikeW Punkte 4714

Wenn Sie nur wissen möchten, ob das Zertifikat abgelaufen ist (oder dies innerhalb der nächsten N Sekunden geschehen wird), teilt Ihnen die Option -checkend von openssl x509 dies mit:

if openssl x509 -checkend 86400 -noout -in file.pem
then
  echo "Zertifikat ist noch einen weiteren Tag gültig!"
else
  echo "Zertifikat ist abgelaufen oder wird dies innerhalb von 24 Stunden tun!"
  echo "(oder ist ungültig/nicht gefunden)"
fi

Dies spart Ihnen die Notwendigkeit, selbst Datums- und Zeitvergleiche durchzuführen.

openssl gibt einen Rückgabecode von 0 (null) zurück, wenn das Zertifikat nicht abgelaufen ist und innerhalb der nächsten 86400 Sekunden nicht ablaufen wird, wie im obigen Beispiel. Wenn das Zertifikat abgelaufen ist oder bereits abgelaufen ist - oder ein anderer Fehler wie eine ungültige/nicht vorhandene Datei vorliegt - beträgt der Rückgabecode 1.

(Natürlich wird davon ausgegangen, dass Datum und Uhrzeit richtig eingestellt sind)

Beachten Sie, dass ältere Versionen von openssl einen Fehler haben, der bedeutet, dass, wenn die im checkend angegebene Zeit zu groß ist, immer 0 zurückgegeben wird (https://github.com/openssl/openssl/issues/6180).

45voto

Nicholas Sushkin Punkte 11780

Hier ist mein Bash-Befehlszeilenbefehl, um mehrere Zertifikate in der Reihenfolge ihres Ablaufs aufzulisten, wobei die zuletzt abgelaufenen zuerst aufgeführt werden.

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

Beispiel-Ausgabe:

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

29voto

Rahul Srivastava Punkte 553

Befehl:

# cat {key_name} | openssl x509 -noout -enddate
Beispiel: # cat tower.cert | openssl x509 -noout -enddate

Ergebnis:

notAfter=7. Dez 04:03:32 2023 GMT

16voto

Andrew Punkte 898

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

function check_certs () {
  if [ -z "$1" ]
  then
    echo "Domainname fehlt"
    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 Tage"
  done
}

Beispiel-Ausgabe:

$ check_certs stackoverflow.com
151.101.1.69: Aug 14 12:00:00 2019 GMT    603 Tage
151.101.65.69: Aug 14 12:00:00 2019 GMT    603 Tage
151.101.129.69: Aug 14 12:00:00 2019 GMT    603 Tage
151.101.193.69: Aug 14 12:00:00 2019 GMT    603 Tage

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X