Zertifikat-Management

Übersicht aller TLS-Zertifikate, Laufzeiten, Auto-Renewal und Notfallprozesse. Kein Zertifikat läuft ab ohne dass jemand es weiß.

Prinzip: Alle Zertifikate im Register

Single Source of Truth Jedes TLS-Zertifikat das wir betreiben steht in specs/infrastructure/certs/cert-inventory.yaml. Der Health-Check prüft Ablaufdaten automatisch bei jedem trigger-validation-chain.sh full.

Warn-Schwellen

StatusVerbleibende TageAktion
OK> 30 TageKeine Aktion nötig
WARN7–30 TageRenewal prüfen / manuell erneuern
CRITICAL< 7 TageSofort erneuern — Ausfall droht

Aktuelle Zertifikate

DomainServiceAussteller Gültig bisAuto-RenewalNode
service.example.com Service Name Let's Encrypt OK automatisch node

Vollständige Liste: specs/infrastructure/certs/cert-inventory.yaml

Let's Encrypt Renewal

Automatisch (Standard)

Let's Encrypt erneuert Zertifikate automatisch (Certbot/acme.sh). Kein manueller Eingriff nötig solange Port 80 erreichbar ist.

Manuell erzwingen

ssh root@SERVER
certbot renew --force-renewal

Status prüfen

ssh root@SERVER \
  "openssl x509 -in /path/to/cert.crt \
   -noout -subject -issuer -dates"

Voraussetzungen für Auto-Renewal

  • DNS zeigt auf Server (Port 80 ACME-Challenge)
  • Port 80 von extern erreichbar
  • Server läuft 03:30 Uhr UTC

Neues Zertifikat registrieren

Wenn ein neuer Service mit TLS aufgebaut wird:

  1. Zertifikat installieren
  2. Eintrag in cert-inventory.yaml hinzufügen
  3. Health-Check laufen lassen
  4. Commit + Evidence

Template

- id: "subdomain.domain.tld"
  service: "Service Name"
  domain: "subdomain.domain.tld"
  server: "IP"
  path_on_server: "/pfad/cert.crt"
  issuer: "Let's Encrypt R13"
  issued: "YYYY-MM-DD"
  expires: "YYYY-MM-DD"
  auto_renew: true
  renew_method: "gitlab-ctl renew-le-certs"
   node: "node-name"
  status: "active"

Notfall: Zertifikat abgelaufen

Wenn HTTPS nicht mehr funktioniert Service ist für alle Nutzer nicht erreichbar. Sofortmaßnahme: temporär HTTP aktivieren, dann Zertifikat erneuern.

Sofortmaßnahme

# 1. Zertifikat erneuern
ssh root@SERVER 'certbot renew --force-renewal'

# 2. Falls Port 80 blockiert ist — Webserver neu starten:
ssh root@SERVER 'systemctl reload nginx'

# 3. Falls Let's Encrypt nicht geht (DNS-Problem):
# Selbst-signiertes Zertifikat als Überbrückung
ssh root@SERVER "
  openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /path/to/service.key \
    -out /path/to/service.crt \
    -subj '/CN=service.example.com'
"

Zertifikat widerrufen

Wenn ein privater Key kompromittiert wurde:

# Let's Encrypt Zertifikat widerrufen
certbot revoke \
  --cert-path /path/to/service.crt

# Danach sofort neues Zertifikat holen
certbot renew --force-renewal

Nach Widerruf: Eintrag in cert-inventory.yaml auf status: "revoked" setzen + Commit.

Automatischer Health-Check

Der Zertifikat-Check läuft automatisch in der Validation Chain:

bash iio/specs/scripts/trigger-validation-chain.sh /home/zolo/space full
# → Check 5: Zertifikat-Ablauf (aus cert-inventory.yaml)

Oder manuell:

bash iio/base/health-check/scripts/health-check-all.sh /home/zolo/space

IIO Manual · Zertifikat-Management · Register: specs/infrastructure/certs/cert-inventory.yaml · ← Übersicht