~~NOTOC~~ ====== Scenario 4.2: Rekey (Nuova chiave) ====== **Categoria:** [[.:start|Gestire certificati]] \\ **Complessità:** Alta \\ **Prerequisiti:** Certificato esistente \\ **Tempo stimato:** 20-30 minuti ---- ===== Descrizione ===== Questo scenario descrive il **Rekey** - l'emissione di un nuovo certificato con una **nuova coppia di chiavi**. Il Rekey è necessario in caso di sospetta compromissione, upgrade di algoritmo o aumento della forza della chiave. **Quando è richiesto il Rekey:** * Sospetto di compromissione della chiave * Migrazione da RSA a ML-DSA (Post-Quantum) * Aumento della lunghezza della chiave * Rotazione di routine (policy di sicurezza) * Scadenza del ciclo di vita massimo della chiave ---- ===== Workflow ===== flowchart LR OLD[Vecchio certificato] --> GEN[Nuova coppia chiavi] GEN --> CSR[Nuovo CSR] CSR --> ISSUE[Nuovo certificato] ISSUE --> DEPLOY[Deployment] DEPLOY --> REVOKE[Revocare vecchio] GEN --> BACKUP[Backup chiave] style GEN fill:#fff3e0 style ISSUE fill:#e8f5e9 ---- ===== Esempio codice (C#) ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using var ctx = PqCryptoContext.Initialize(); // Caricare vecchio certificato (per Subject/SAN) var oldCert = ctx.LoadCertificate("server.crt.pem"); // Caricare CA var caCert = ctx.LoadCertificate("intermediate-ca.crt.pem"); var caKey = ctx.LoadPrivateKey("intermediate-ca.key.pem", "CaPassword!"); // Generare NUOVA coppia di chiavi (upgrade PQ!) using var newKey = ctx.GenerateKeyPair(PqAlgorithm.MlDsa65); // Mantenere Subject e SAN dal vecchio certificato var oldSans = ctx.GetSubjectAlternativeNames(oldCert); // Nuovo CSR con nuova chiave var csr = ctx.CreateCertificateRequest( newKey, oldCert.SubjectName, // Mantenere subject new ExtBuilder() .SubjectAlternativeName(oldSans) // Mantenere SAN .Build() ); // Emettere nuovo certificato var newCert = ctx.IssueCertificate( csr, issuerCert: caCert, issuerKey: caKey, serialNumber: ctx.GenerateSerialNumber(), validDays: 365, extensions: new ExtBuilder() .BasicConstraints(ca: false, critical: true) .KeyUsage(KeyUsageFlags.DigitalSignature | KeyUsageFlags.KeyEncipherment) .ExtendedKeyUsage(ExtKeyUsage.ServerAuth) .SubjectKeyIdentifier(newKey.PublicKey) // NUOVO SKI! .AuthorityKeyIdentifier(caCert) .CrlDistributionPoint("http://crl.example.com/intermediate.crl") .Build() ); // Salvare newCert.ToPemFile("server-rekeyed.crt.pem"); newKey.ToEncryptedPemFile("server-rekeyed.key.pem", "NewKeyPassword!"); Console.WriteLine("Rekey completato:"); Console.WriteLine($" Vecchio algoritmo: {oldCert.PublicKey.Oid.FriendlyName}"); Console.WriteLine($" Nuovo algoritmo: ML-DSA-65"); Console.WriteLine($" Vecchio SKI: {oldCert.GetSubjectKeyIdentifier()}"); Console.WriteLine($" Nuovo SKI: {newCert.GetSubjectKeyIdentifier()}"); ---- ===== Migrazione PQ: RSA a ML-DSA ===== Per la migrazione da algoritmi classici a Post-Quantum: // Rekey ibrido: RSA + ML-DSA in parallelo public class HybridRekey { public static (X509Certificate2 classical, X509Certificate2 pq) PerformHybridRekey( X509Certificate2 oldRsaCert, PqCryptoContext ctx, X509Certificate2 caCert, AsymmetricAlgorithm caKey) { // 1. Rinnovare chiave RSA (fase di transizione) using var newRsaKey = RSA.Create(4096); var rsaCsr = ctx.CreateCertificateRequest(newRsaKey, oldRsaCert.SubjectName); var rsaCert = ctx.IssueCertificate(rsaCsr, caCert, caKey, validDays: 365); // 2. Creare chiave ML-DSA (futuro) using var mlDsaKey = ctx.GenerateKeyPair(PqAlgorithm.MlDsa65); var pqCsr = ctx.CreateCertificateRequest(mlDsaKey, oldRsaCert.SubjectName); var pqCert = ctx.IssueCertificate(pqCsr, caCert, caKey, validDays: 365); return (rsaCert, pqCert); } } ---- ===== Requisiti Rekey specifici per settore ===== ^ Settore ^ Durata max. chiave ^ Trigger Rekey ^ Particolarità ^ | **Settore finanziario** | 2 anni | Policy HSM | Conformità FIPS 140-3 | | **Sanità** | 3 anni | Risultato audit | Conformità DiGAV | | **Energia/SCADA** | 5 anni | Finestra manutenzione | Capacità offline | | **Automotive** | Vita del veicolo | Security-Update | Meccanismo OTA | ---- ===== Checklist Rekey ===== **Prima del Rekey:** - [ ] Salvare vecchia chiave (se ancora necessaria) - [ ] Identificare tutti i sistemi che usano il certificato - [ ] Creare piano di deployment - [ ] Preparare piano di rollback - [ ] Comunicare finestra di manutenzione **Dopo il Rekey:** - [ ] Distribuire nuovo certificato su tutti i sistemi - [ ] Testare connessioni - [ ] Revocare vecchio certificato - [ ] Distruggere in sicurezza vecchia chiave - [ ] Aggiornare documentazione ---- ===== Scenari correlati ===== ^ Relazione ^ Scenario ^ Descrizione ^ | **Alternativa** | [[.:renewal|4.1 Renewal]] | Stessa chiave | | **Passo successivo** | [[it:int:pqcrypt:szenarien:widerruf:zertifikat_widerrufen|6.4 Revocare]] | Vecchio certificato | | **Prerequisito** | [[it:int:pqcrypt:szenarien:schluessel:generierung|11.1 Generazione chiavi]] | Nuova chiave | | **Correlato** | [[it:int:pqcrypt:szenarien:schluessel:vernichtung|11.5 Distruzione chiavi]] | Eliminare vecchia chiave | ---- << [[.:renewal|← 4.1 Renewal]] | [[.:start|↑ Panoramica gestione]] | [[.:archivierung|4.3 Archiviazione →]] >> {{tag>scenario gestione rekey chiave migrazione pq}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//