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
| Status | Verbleibende Tage | Aktion |
|---|---|---|
| OK | > 30 Tage | Keine Aktion nötig |
| WARN | 7–30 Tage | Renewal prüfen / manuell erneuern |
| CRITICAL | < 7 Tage | Sofort erneuern — Ausfall droht |
Aktuelle Zertifikate
| Domain | Service | Aussteller | Gültig bis | Auto-Renewal | Node |
|---|---|---|---|---|---|
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:
- Zertifikat installieren
- Eintrag in
cert-inventory.yamlhinzufügen - Health-Check laufen lassen
- 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