~~NOTOC~~ ====== Szenario 4.1: Zertifikat-Erneuerung (Renewal) ====== **Kategorie:** [[.:start|Zertifikate verwalten]] \\ **Komplexität:** ⭐⭐⭐ (Mittel) \\ **Voraussetzungen:** Bestehendes Zertifikat, gleicher Schlüssel \\ **Geschätzte Zeit:** 10-15 Minuten ---- ===== Beschreibung ===== Dieses Szenario beschreibt die **Erneuerung eines ablaufenden Zertifikats** unter Beibehaltung des bestehenden Schlüsselpaars. Renewal ist sinnvoll, wenn der Schlüssel nicht kompromittiert wurde und die Schlüsselstärke noch ausreichend ist. **Renewal vs. Rekey:** ^ Aspekt ^ Renewal ^ Rekey ^ | Schlüsselpaar | Gleich | Neu | | CSR | Optional neu | Pflicht neu | | Subject | Kann angepasst werden | Kann angepasst werden | | Grund | Ablauf | Kompromittierung, Upgrade | ---- ===== Workflow ===== flowchart LR LOAD[Altes Zertifikat laden] --> CHECK[Ablauf prüfen] CHECK --> CSR[CSR mit gleichem Key] CSR --> ISSUE[Neues Zertifikat] ISSUE --> DEPLOY[Deployment] DEPLOY --> REVOKE[Altes widerrufen] style ISSUE fill:#e8f5e9 ---- ===== Code-Beispiel (C#) ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using var ctx = PqCryptoContext.Initialize(); // Bestehendes Zertifikat und Schlüssel laden var oldCert = ctx.LoadCertificate("server.crt.pem"); var existingKey = ctx.LoadPrivateKey("server.key.pem", "KeyPassword!"); // CA laden var caCert = ctx.LoadCertificate("intermediate-ca.crt.pem"); var caKey = ctx.LoadPrivateKey("intermediate-ca.key.pem", "CaPassword!"); // Prüfen ob Renewal sinnvoll ist var daysUntilExpiry = (oldCert.NotAfter - DateTime.UtcNow).Days; if (daysUntilExpiry > 90) { Console.WriteLine($"Zertifikat noch {daysUntilExpiry} Tage gültig."); } // CSR mit bestehendem Schlüssel erstellen var csr = ctx.CreateCertificateRequest( existingKey, oldCert.SubjectName, // Subject übernehmen ctx.GetExtensions(oldCert) // Extensions übernehmen ); // Neues Zertifikat ausstellen var newCert = ctx.IssueCertificate( csr, issuerCert: caCert, issuerKey: caKey, serialNumber: ctx.GenerateSerialNumber(), // Neue Serial! validFrom: DateTime.UtcNow.AddDays(-1), // Überlappung validDays: 365, extensions: new ExtBuilder() .BasicConstraints(ca: false, critical: true) .KeyUsage(KeyUsageFlags.DigitalSignature | KeyUsageFlags.KeyEncipherment) .ExtendedKeyUsage(ExtKeyUsage.ServerAuth) .SubjectKeyIdentifier(existingKey.PublicKey) // Gleicher SKI! .AuthorityKeyIdentifier(caCert) .CrlDistributionPoint("http://crl.example.com/intermediate.crl") .Build() ); // Speichern newCert.ToPemFile("server-renewed.crt.pem"); Console.WriteLine("Zertifikat erneuert:"); Console.WriteLine($" Alte Serial: {oldCert.SerialNumber}"); Console.WriteLine($" Neue Serial: {newCert.SerialNumber}"); Console.WriteLine($" Neues Ablaufdatum: {newCert.NotAfter:yyyy-MM-dd}"); ---- ===== Automatische Renewal-Prüfung ===== // Alle Zertifikate im Store prüfen public IEnumerable GetExpiringCertificates( X509Store store, int warningDays = 30) { store.Open(OpenFlags.ReadOnly); try { return store.Certificates .Where(c => c.NotAfter <= DateTime.UtcNow.AddDays(warningDays)) .Where(c => c.NotAfter > DateTime.UtcNow) // Noch nicht abgelaufen .OrderBy(c => c.NotAfter) .ToList(); } finally { store.Close(); } } // Verwendung using var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); var expiring = GetExpiringCertificates(store, warningDays: 30); foreach (var cert in expiring) { Console.WriteLine($"WARNUNG: {cert.Subject} läuft ab am {cert.NotAfter:d}"); } ---- ===== Branchenspezifische Renewal-Zyklen ===== ^ Branche ^ Typischer Zyklus ^ Renewal-Vorlauf ^ Besonderheit ^ | **Standard IT** | 1 Jahr | 30 Tage | Automatisierung empfohlen | | **Energie/SCADA** | 3-5 Jahre | 90 Tage | Wartungsfenster beachten | | **Healthcare** | 1-2 Jahre | 60 Tage | Audit-Trail erforderlich | | **Automotive** | 2-3 Jahre | 180 Tage | OTA-Update Planung | ---- ===== Best Practices ===== **Renewal-Empfehlungen:** * Überlappungszeit einplanen (altes Zertifikat 1-7 Tage nach Renewal noch gültig) * Automatisches Monitoring implementieren * Altes Zertifikat erst nach erfolgreichem Deployment widerrufen * Subject Key Identifier bleibt gleich (erleichtert Tracking) **Wann NICHT erneuern:** * Schlüssel möglicherweise kompromittiert → [[.:rekey|Rekey]] * Algorithmus-Upgrade nötig (RSA → ML-DSA) → [[.:rekey|Rekey]] * Schlüssellänge zu kurz → [[.:rekey|Rekey]] ---- ===== Verwandte Szenarien ===== ^ Beziehung ^ Szenario ^ Beschreibung ^ | **Alternative** | [[.:rekey|4.2 Rekey]] | Neuer Schlüssel | | **Nächster Schritt** | [[de:int:pqcrypt:szenarien:widerruf:zertifikat_widerrufen|6.4 Widerrufen]] | Altes Zertifikat | | **Verwandt** | [[.:backup|4.4 Backup]] | Vor Renewal sichern | ---- << [[.:start|← Verwaltung-Übersicht]] | [[de:int:pqcrypt:szenarien:start|↑ Szenarien]] | [[.:rekey|4.2 Rekey →]] >> {{tag>szenario verwaltung renewal erneuerung zertifikat}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//