Categoria: Gestire certificati
Complessità: Media
Prerequisiti: Certificato esistente, stessa chiave
Tempo stimato: 10-15 minuti
Questo scenario descrive il rinnovo di un certificato in scadenza mantenendo la coppia di chiavi esistente. Il Renewal è utile quando la chiave non è stata compromessa e la forza della chiave è ancora sufficiente.
Renewal vs. Rekey:
| Aspetto | Renewal | Rekey |
|---|---|---|
| Coppia chiavi | Stessa | Nuova |
| CSR | Opzionalmente nuovo | Obbligatoriamente nuovo |
| Subject | Può essere modificato | Può essere modificato |
| Motivo | Scadenza | Compromissione, upgrade |
using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using var ctx = PqCryptoContext.Initialize(); // Caricare certificato e chiave esistenti var oldCert = ctx.LoadCertificate("server.crt.pem"); var existingKey = ctx.LoadPrivateKey("server.key.pem", "KeyPassword!"); // Caricare CA var caCert = ctx.LoadCertificate("intermediate-ca.crt.pem"); var caKey = ctx.LoadPrivateKey("intermediate-ca.key.pem", "CaPassword!"); // Verificare se il renewal è opportuno var daysUntilExpiry = (oldCert.NotAfter - DateTime.UtcNow).Days; if (daysUntilExpiry > 90) { Console.WriteLine($"Certificato ancora valido per {daysUntilExpiry} giorni."); } // Creare CSR con chiave esistente var csr = ctx.CreateCertificateRequest( existingKey, oldCert.SubjectName, // Mantenere subject ctx.GetExtensions(oldCert) // Mantenere estensioni ); // Emettere nuovo certificato var newCert = ctx.IssueCertificate( csr, issuerCert: caCert, issuerKey: caKey, serialNumber: ctx.GenerateSerialNumber(), // Nuovo serial! validFrom: DateTime.UtcNow.AddDays(-1), // Sovrapposizione validDays: 365, extensions: new ExtBuilder() .BasicConstraints(ca: false, critical: true) .KeyUsage(KeyUsageFlags.DigitalSignature | KeyUsageFlags.KeyEncipherment) .ExtendedKeyUsage(ExtKeyUsage.ServerAuth) .SubjectKeyIdentifier(existingKey.PublicKey) // Stesso SKI! .AuthorityKeyIdentifier(caCert) .CrlDistributionPoint("http://crl.example.com/intermediate.crl") .Build() ); // Salvare newCert.ToPemFile("server-renewed.crt.pem"); Console.WriteLine("Certificato rinnovato:"); Console.WriteLine($" Vecchio Serial: {oldCert.SerialNumber}"); Console.WriteLine($" Nuovo Serial: {newCert.SerialNumber}"); Console.WriteLine($" Nuova scadenza: {newCert.NotAfter:yyyy-MM-dd}");
// Verificare tutti i certificati nello store 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) // Non ancora scaduto .OrderBy(c => c.NotAfter) .ToList(); } finally { store.Close(); } } // Utilizzo using var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); var expiring = GetExpiringCertificates(store, warningDays: 30); foreach (var cert in expiring) { Console.WriteLine($"AVVISO: {cert.Subject} scade il {cert.NotAfter:d}"); }
| Settore | Ciclo tipico | Anticipo renewal | Particolarità |
|---|---|---|---|
| IT standard | 1 anno | 30 giorni | Automazione raccomandata |
| Energia/SCADA | 3-5 anni | 90 giorni | Considerare finestre manutenzione |
| Sanità | 1-2 anni | 60 giorni | Audit trail richiesto |
| Automotive | 2-3 anni | 180 giorni | Pianificazione aggiornamento OTA |
Raccomandazioni per il renewal:
Quando NON rinnovare:
| Relazione | Scenario | Descrizione |
|---|---|---|
| Alternativa | 4.2 Rekey | Nuova chiave |
| Passo successivo | 6.4 Revocare | Vecchio certificato |
| Correlato | 4.4 Backup | Salvare prima del renewal |
« ← Panoramica gestione | ↑ Scenari | 4.2 Rekey → »
Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional