~~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//