Kategorie: Zertifikate verwalten
Komplexität: ⭐⭐⭐ (Mittel)
Voraussetzungen: Bestehendes Zertifikat, gleicher Schlüssel
Geschätzte Zeit: 10-15 Minuten
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 |
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}");
// Alle Zertifikate im Store prüfen public IEnumerable<X509Certificate2> 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}"); }
| 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 |
Renewal-Empfehlungen:
Wann NICHT erneuern:
| Beziehung | Szenario | Beschreibung |
|---|---|---|
| Alternative | 4.2 Rekey | Neuer Schlüssel |
| Nächster Schritt | 6.4 Widerrufen | Altes Zertifikat |
| Verwandt | 4.4 Backup | Vor Renewal sichern |
« ← Verwaltung-Übersicht | ↑ Szenarien | 4.2 Rekey → »
Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional