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.
Antworten
Zu viele Anzeigen?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.
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).
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
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
- See previous answers
- Weitere Antworten anzeigen