====== Migrazione Classic → Hybrid ======
**Complessità:** Media \\
**Durata:** 6-12 mesi (completa) \\
**Rischio:** Basso-Medio
Migrazione graduale da PKI classica (RSA/ECDSA) a modalità ibrida (Classico + ML-DSA).
----
===== Panoramica =====
flowchart TB
subgraph PHASE1["Fase 1: Preparazione"]
P1A[Inventario]
P1B[Ambiente test]
P1C[Aggiornamento tooling]
end
subgraph PHASE2["Fase 2: Infrastruttura"]
P2A[Root-CA Hybrid]
P2B[Intermediate-CA]
P2C[Aggiornamento CRL/OCSP]
end
subgraph PHASE3["Fase 3: Rollout"]
P3A[Certificati server]
P3B[Certificati client]
P3C[Code-Signing]
end
subgraph PHASE4["Fase 4: Validazione"]
P4A[Monitoraggio]
P4B[Audit]
P4C[Documentazione]
end
P1A --> P1B --> P1C --> P2A
P2A --> P2B --> P2C --> P3A
P3A --> P3B --> P3C --> P4A
P4A --> P4B --> P4C
style P2A fill:#fff3e0
style P3A fill:#e8f5e9
----
===== Fase 1: Preparazione (1-2 mesi) =====
==== 1.1 Eseguire inventario ====
#!/bin/bash
# inventory-certs.sh - Inventario certificati
echo "=== Inventario certificati $(date) ===" > inventory.csv
echo "Percorso,Subject,Algoritmo,DimensioneChiave,Scadenza,Giorni" >> inventory.csv
# Certificati locali
for cert in /etc/ssl/certs/*.pem /etc/pki/tls/certs/*.pem; do
[ -f "$cert" ] || continue
subject=$(openssl x509 -in "$cert" -subject -noout 2>/dev/null | sed 's/subject=//')
algo=$(openssl x509 -in "$cert" -text -noout 2>/dev/null | grep "Public Key Algorithm" | awk '{print $4}')
keysize=$(openssl x509 -in "$cert" -text -noout 2>/dev/null | grep "Public-Key:" | grep -oP '\d+')
expiry=$(openssl x509 -in "$cert" -enddate -noout 2>/dev/null | cut -d= -f2)
days=$(( ($(date -d "$expiry" +%s) - $(date +%s)) / 86400 ))
echo "\"$cert\",\"$subject\",\"$algo\",\"$keysize\",\"$expiry\",\"$days\"" >> inventory.csv
done
echo "Inventario completato: inventory.csv"
→ Dettagli: [[.:inventur|Inventario certificati]]
==== 1.2 Configurare ambiente di test ====
# PKI di test basata su Docker
docker run -d --name test-ca \
-v /test-pki:/pki \
-e OPENSSL_CONF=/pki/openssl.cnf \
alpine/openssl
# OpenSSL 3.6 per PQ
docker exec test-ca openssl version
# OpenSSL 3.6.0 ...
# Test: Creare certificato ibrido
docker exec test-ca openssl genpkey -algorithm ML-DSA-65 -out /pki/test-mldsa.key
==== 1.3 Aggiornamento tooling ====
| Strumento | Versione min. | Supporto PQ |
|-----------|---------------|-------------|
| OpenSSL | 3.6.0 | ML-DSA, ML-KEM |
| .NET | 9.0+ | Tramite WvdS.System.Security.Cryptography |
| Java | 21+ | Tramite BouncyCastle 1.78 |
| curl | 8.5+ | TLS ibrido |
----
===== Fase 2: Infrastruttura (2-3 mesi) =====
==== 2.1 Migrare Root-CA a Hybrid ====
**La migrazione della Root-CA è il passo più critico.** Pianificare con cura e testare approfonditamente.
**Opzione A: Nuova Root-CA Hybrid (raccomandata)**
// Creare nuova Root-CA Hybrid
using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP384);
var request = new CertificateRequest(
"CN=My Organization Root CA - Hybrid, O=My Organization",
ecdsa,
HashAlgorithmName.SHA384);
// Estensioni CA
request.CertificateExtensions.Add(
new X509BasicConstraintsExtension(true, true, 2, true));
request.CertificateExtensions.Add(
new X509KeyUsageExtension(
X509KeyUsageFlags.KeyCertSign | X509KeyUsageFlags.CrlSign,
true));
// Self-Signed Hybrid (ECDSA + ML-DSA)
var hybridRoot = request.CreateSelfSigned(
DateTimeOffset.UtcNow,
DateTimeOffset.UtcNow.AddYears(25),
CryptoMode.Hybrid);
// Esportazione
File.WriteAllBytes("hybrid-root-ca.pfx",
hybridRoot.Export(X509ContentType.Pfx, "secure-password"));
**Opzione B: Cross-Certification (transizione)**
// Vecchia Root-CA cross-certifica nuova CA Hybrid
using var oldRoot = new X509Certificate2("old-root.pfx", "password");
using var newHybridRoot = new X509Certificate2("hybrid-root.pfx", "password");
// Creare certificato cross
var crossCertRequest = new CertificateRequest(
newHybridRoot.SubjectName,
newHybridRoot.GetECDsaPublicKey()!,
HashAlgorithmName.SHA384);
// Firmato dalla vecchia Root
var crossCert = crossCertRequest.Create(
oldRoot,
newHybridRoot.NotBefore,
newHybridRoot.NotAfter,
newHybridRoot.SerialNumberBytes.ToArray());
==== 2.2 Migrare Intermediate-CA ====
// Firmare Intermediate con Hybrid-Root
using var hybridRoot = new X509Certificate2("hybrid-root.pfx", "password");
var intermediateCsr = CertificateRequest.LoadSigningRequest(
File.ReadAllBytes("intermediate.csr"),
HashAlgorithmName.SHA384);
// Aggiungere estensioni CA
intermediateCsr.CertificateExtensions.Add(
new X509BasicConstraintsExtension(true, true, 1, true));
var intermediate = intermediateCsr.Create(
hybridRoot,
DateTimeOffset.UtcNow,
DateTimeOffset.UtcNow.AddYears(10),
Guid.NewGuid().ToByteArray(),
CryptoMode.Hybrid);
==== 2.3 Aggiornamento CRL/OCSP ====
// Creare CRL firmata Hybrid
var crlBuilder = new CertificateRevocationListBuilder();
// Riprendere voci CRL esistenti
foreach (var entry in existingCrlEntries)
{
crlBuilder.AddEntry(entry.SerialNumber, entry.RevocationDate, entry.Reason);
}
// Firmare con CA Hybrid
byte[] newCrl = crlBuilder.Build(
hybridIntermediate,
newCrlNumber,
DateTimeOffset.UtcNow.AddDays(7),
HashAlgorithmName.SHA384,
CryptoMode.Hybrid);
----
===== Fase 3: Rollout (3-6 mesi) =====
==== 3.1 Certificati server ====
**Matrice priorità:**
| Tipo server | Priorità | Motivo |
|-------------|----------|--------|
| API esterne | Alta | Rischio massimo |
| Microservizi interni | Media | Movimento laterale |
| Development | Bassa | Ambiente test |
==== 3.2 Certificati client ====
// Emettere certificato client con Hybrid
var clientCsr = CertificateRequest.LoadSigningRequest(csrBytes, HashAlgorithmName.SHA384);
clientCsr.CertificateExtensions.Add(
new X509EnhancedKeyUsageExtension(
new OidCollection { new Oid("1.3.6.1.5.5.7.3.2") }, // Client Auth
false));
var clientCert = clientCsr.Create(
intermediate,
DateTimeOffset.UtcNow,
DateTimeOffset.UtcNow.AddYears(1),
Guid.NewGuid().ToByteArray(),
CryptoMode.Hybrid);
----
===== Fase 4: Validazione (1-2 mesi) =====
==== 4.1 Attivare monitoraggio ====
# Alert Prometheus per stato Hybrid
- alert: NonHybridCertificateInProduction
expr: x509_cert_algorithm{env="production"} !~ ".*ML-DSA.*|.*Hybrid.*"
for: 24h
labels:
severity: warning
annotations:
summary: "Certificato non-Hybrid in produzione: {{ $labels.filepath }}"
==== 4.2 Checklist ====
| # | Punto di verifica | Stato |
|---|-------------------|-------|
| 1 | Tutti i certificati CA su Hybrid | ☐ |
| 2 | Tutti i certificati server rinnovati | ☐ |
| 3 | CRL/OCSP firmati con Hybrid | ☐ |
| 4 | Trust Store aggiornati | ☐ |
| 5 | Monitoraggio non mostra solo-classici | ☐ |
| 6 | Rollback testato | ☐ |
| 7 | Documentazione aggiornata | ☐ |
----
===== Piano di rollback =====
→ Dettagli: [[.:rollback-strategie|Strategia di rollback]]
----
===== Documentazione correlata =====
* [[.:parallel-betrieb|Funzionamento parallelo]] – Strategia alternativa
* [[.:inventur|Inventario]] – Rilevamento dettagliato
* [[it:int:pqcrypt:konzepte:start|Modalità crypto]] – Spiegazione Hybrid
----
<< [[.:start|← Migrazione]] | [[.:parallel-betrieb|→ Funzionamento parallelo]] >>
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//
{{tag>migrazione hybrid classic upgrade operator}}