diff --git a/scripts/renew-mikrotik-cert.sh b/scripts/renew-mikrotik-cert.sh index c215253..bd7d953 100755 --- a/scripts/renew-mikrotik-cert.sh +++ b/scripts/renew-mikrotik-cert.sh @@ -22,6 +22,12 @@ TTL="2160h" # 90 Tage, wie bei openbao/gitea RT_HOST="192.168.0.2" RT_USER="apics" # group=full, address=192.168.0.0/24 RENEW_WINDOW_DAYS="${RENEW_WINDOW_DAYS:-21}" +# Fuer die vollstaendige Kette muss die Zwischen-CA im Zertifikatsspeicher des +# Routers liegen (2026-10-22 als famfi-int-ca-20261022.crt_0 importiert). RouterOS +# verknuepft Blatt und CA beim IMPORT des Blattes; fehlt die CA, liefert api-ssl nur +# das Blatt aus und strenge Clients scheitern mit "unable to get local issuer +# certificate". Wird die CA je entfernt, faellt das unten in der Kettenpruefung auf. +ROOT_CA="${ROOT_CA:-/home/lutz/.config/famfi-ca/famfi-home-root-ca.pem}" FORCE="${1:-}" log() { printf '%s [renew-mikrotik-cert] %s\n' "$(date '+%F %T')" "$*"; } @@ -135,3 +141,19 @@ end_new="$(echo "$got" | sed -n 's/^notAfter=//p')" left=$(( ( $(date -d "$end_new" +%s) - $(date +%s) ) / 86400 )) [ "$left" -gt 0 ] || die "ausgeliefertes Zertifikat ist nicht gueltig (${left}d)" log "OK - noch ${left} Tage gueltig" + +# Kette pruefen: gegen die ROOT allein verifizieren. Das gelingt nur, wenn der +# Router die Zwischen-CA mitschickt. Kein die(), denn das Zertifikat selbst ist +# in Ordnung - es ist ein Mangel, kein Ausfall, und ein Abbruch hier wuerde einen +# erfolgreichen Austausch als Fehlschlag melden. +if [ -r "$ROOT_CA" ]; then + if echo | timeout 20 openssl s_client -connect "${RT_HOST}:8729" \ + -CAfile "$ROOT_CA" 2>&1 | grep -q "Verify return code: 0"; then + log "Kette vollstaendig (gegen die Root-CA verifiziert)" + else + log "WARNUNG: api-ssl liefert keine vollstaendige Kette - liegt die Zwischen-CA" + log " noch im Speicher? /certificate print where common-name~\"Intermediate\"" + fi +else + log "Kettenpruefung uebersprungen: $ROOT_CA nicht lesbar" +fi