====== Runbook: Zertifikat erneuern ====== **Dauer:** ~15 Minuten \\ **Rolle:** PKI-Operator \\ **Trigger:** Ablauf-Warnung (30/14/7 Tage) ---- ===== Workflow ===== flowchart TD A[Ablauf-Warnung] --> B{Schlüssel kompromittiert?} B -->|Ja| C[→ Widerrufs-Runbook] B -->|Nein| D{Gleiches Schlüsselpaar?} D -->|Ja| E[Re-Certification] D -->|Nein| F[Re-Key] E --> G[Neues Zertifikat] F --> H[Neuer CSR] H --> G G --> I[Altes Zertifikat archivieren] I --> J[Neues Zertifikat deployen] J --> K[Monitoring aktualisieren] style B fill:#ffebee style G fill:#e8f5e9 style J fill:#e3f2fd ---- ===== Schritt 1: Ablaufende Zertifikate identifizieren ===== # Alle Zertifikate mit Ablauf < 30 Tage find /etc/ssl/certs -name "*.pem" -exec sh -c ' enddate=$(openssl x509 -enddate -noout -in "$1" 2>/dev/null | cut -d= -f2) if [ -n "$enddate" ]; then expiry=$(date -d "$enddate" +%s 2>/dev/null) now=$(date +%s) days=$(( (expiry - now) / 86400 )) if [ "$days" -lt 30 ]; then echo "$1: $days Tage" fi fi ' _ {} \; # PowerShell: Ablaufende Zertifikate finden Get-ChildItem Cert:\LocalMachine\My | Where-Object { $_.NotAfter -lt (Get-Date).AddDays(30) } | Select-Object Subject, NotAfter, Thumbprint ---- ===== Schritt 2: Erneuerungsmethode wählen ===== | Methode | Wann verwenden | Vorteil | |---------|----------------|---------| | **Re-Certification** | Schlüssel sicher, keine Änderungen | Schnell, kein Re-Deploy | | **Re-Key** | Neue Schlüssellänge, Policy-Änderung | Sicherheit erhöht | | **Replace** | Neuer Algorithmus (→ PQ) | Zukunftssicher | ---- ===== Schritt 3a: Re-Certification (gleiches Schlüsselpaar) ===== # CSR aus bestehendem Zertifikat + Key generieren openssl x509 -x509toreq -in old_cert.pem -signkey private.key -out renew.csr # Neues Zertifikat ausstellen openssl ca -config openssl.cnf \ -extensions server_cert \ -in renew.csr \ -out renewed_cert.pem \ -days 365 \ -notext ---- ===== Schritt 3b: Re-Key (neues Schlüsselpaar) ===== # Neuen Schlüssel generieren (EC P-384) openssl ecparam -genkey -name secp384r1 -out new_private.key # Neuen CSR mit gleichem Subject openssl req -new -key new_private.key -out rekey.csr \ -subj "$(openssl x509 -in old_cert.pem -subject -noout | sed 's/subject=//')" # Zertifikat ausstellen openssl ca -config openssl.cnf \ -extensions server_cert \ -in rekey.csr \ -out rekeyed_cert.pem \ -days 365 ---- ===== Schritt 3c: Replace (Upgrade zu Hybrid/PQ) ===== // Migration zu Hybrid-Modus using var oldCert = new X509Certificate2("old_cert.pfx", "password"); // Neues Schlüsselpaar (ML-DSA-65 für Hybrid) using var mlDsa = MlDsaSigner.Create(MlDsaParameterSet.MlDsa65); using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP384); var request = new CertificateRequest( oldCert.SubjectName, ecdsa, HashAlgorithmName.SHA384); // Extensions übernehmen foreach (var ext in oldCert.Extensions) request.CertificateExtensions.Add(ext); // Hybrid-Zertifikat erstellen var newCert = request.CreateSelfSigned( DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddDays(365), CryptoMode.Hybrid); ---- ===== Schritt 4: Altes Zertifikat archivieren ===== # Archivieren mit Metadaten ARCHIVE_DIR="/var/archive/certs/$(date +%Y)" mkdir -p "$ARCHIVE_DIR" # Zertifikat + Metadaten cp old_cert.pem "$ARCHIVE_DIR/$(openssl x509 -serial -noout -in old_cert.pem | cut -d= -f2).pem" # Archiv-Log echo "$(date -Iseconds) RENEWED $(openssl x509 -serial -noout -in old_cert.pem)" >> /var/log/cert-archive.log ---- ===== Schritt 5: Deployment ===== | System | Deployment-Methode | Neustart erforderlich | |--------|-------------------|----------------------| | Apache | ''cp cert.pem /etc/ssl/; systemctl reload apache2'' | Nein | | Nginx | ''cp cert.pem /etc/nginx/ssl/; nginx -s reload'' | Nein | | IIS | ''Import-PfxCertificate; netsh http update'' | Nein | | Kubernetes | ''kubectl create secret tls'' | Pod Restart | # Apache/Nginx Reload systemctl reload apache2 # oder nginx -s reload # Verbindung testen openssl s_client -connect server.example.com:443 -brief ---- ===== Schritt 6: Monitoring aktualisieren ===== # Neuen Fingerprint in Monitoring eintragen NEW_FP=$(openssl x509 -fingerprint -sha256 -noout -in renewed_cert.pem | cut -d= -f2) echo "Neuer Fingerprint: $NEW_FP" # Prometheus-Alert aktualisieren (falls fingerprint-basiert) # Ablaufdatum im Monitoring sollte automatisch aktualisiert werden ---- ===== Checkliste nach Erneuerung ===== | # | Prüfpunkt | Befehl | ✓ | |---|-----------|--------|---| | 1 | Neues Zertifikat aktiv | ''openssl s_client -connect host:443'' | ☐ | | 2 | Kette vollständig | ''openssl verify -CAfile chain.pem cert.pem'' | ☐ | | 3 | Altes Zertifikat archiviert | ''ls /var/archive/certs/'' | ☐ | | 4 | Ticket geschlossen | Ticket-System | ☐ | | 5 | Monitoring aktualisiert | Dashboard prüfen | ☐ | ---- ===== Fehlerbehebung ===== | Problem | Ursache | Lösung | |---------|---------|--------| | ''certificate has expired'' | Reload vergessen | Service neustarten | | ''certificate chain incomplete'' | Intermediate fehlt | ''cat cert.pem intermediate.pem > fullchain.pem'' | | ''hostname mismatch'' | SAN nicht aktualisiert | CSR mit korrekten SANs | | Client vertraut nicht | CA nicht im Store | CA-Zertifikat verteilen | ---- ===== Verwandte Runbooks ===== * [[.:zertifikat-ausstellen|Zertifikat ausstellen]] – Neue Zertifikate * [[.:zertifikat-widerrufen|Zertifikat widerrufen]] – Bei Kompromittierung * [[..:automatisierung:scheduled-renewal|Automatische Erneuerung]] – Automation ---- << [[.:zertifikat-ausstellen|← Zertifikat ausstellen]] | [[.:zertifikat-widerrufen|→ Zertifikat widerrufen]] >> ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional// {{tag>runbook zertifikat erneuern renewal operator}}