Ich arbeite mit SSH Zertifikaten - gegenüber den SSH public Keys haben sie einige wesentliche Vorteile. Zusätzlich möchte ich meine Zertifikate erneuern kurz bevor sie ablaufen. Wie das automatisiert gehen kann weiß ich zur Zeit noch nicht, aber ich weiß immerhin bereits wie ich herausfinden kann dass ein Zertifikat bald abläuft:

# Speichere das Ablaufdatum in einer Variable
cert_expiry_date=$(ssh-keygen -L -f ~/.ssh/id_ed25519-cert.pub | grep "Valid:" | cut -d " " -f 13)
# Speichere das Ablaufdatum als Sekunden seit der Epoche
cert_expiry_seconds=$(date +%s -d $cert_expiry_date)

# Zusätzlich benötige ich das heutige Datum in Sekunden seit der Epoche
now=$(date +%s)

# Berechne jetzt die Anzahl der Tage zwischen "jetzt" und
# "Zertifikatsablauf". Achtung: Keine Leerzeichen für die
# Division, sonst scheitert Bash an der Aufgabe.
let validity=($cert_expiry_seconds - $now)/86400

Um zu verstehen was passiert: ssh-keygen in der oben angeführten Version gibt in etwa die folgende Antwort:

chris@computer:~$ ssh-keygen -L -f ~/.ssh/id_ed25519-cert.pub
    Type: ssh-ed25519-cert-v01@openssh.com user certificate
    ...
    Valid: from 2024-03-23T17:34:00 to 2024-04-27T18:35:12
    ...
  • Die erste Zeile des Skripts sucht nach der Valid: Zeile und extrahiert das letzte Datum aus dieser Zeile.
  • Dann konvertieren wir das Datum in einen Timestamp in Sekunden.
  • Als nächstes benötigen wir auch das aktuelle Datum als Timestamp in Sekunden.
  • Schlussendlich subtrahieren wir die beiden Timestamps (beachte dass bestenfalls cert_expiry_seconds größer als now ist, da das Zertifikat noch nicht abgelaufen sein sollte).
    Das Ergebnis wird durch $86400 = 24 \cdot 60 \cdot 60$ dividiert. Das Ergebnis ist also die Anzahl der Tage, die das Zertifikat noch gültig ist.
    Diesen Post schreibe ich am 10. April 2024. Da das Zertifikat bis zum 27. April gültig ist, erwarte ich von diesem Skript validity mit dem Wert 17.

Für die automatisierte Erneuerung stelle ich mir dann in etwa das Folgende vor:

if [ $validity -lt 4 ]; then
    # renew the certificate
fi