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: 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: Strategia di rollback


Documentazione correlata


« ← Migrazione | → Funzionamento parallelo »


Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional

Zuletzt geändert: il 30/01/2026 alle 01:36