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