====== Classic → Hybrid Migration ====== **Komplexität:** Mittel \\ **Dauer:** 6-12 Monate (vollständig) \\ **Risiko:** Niedrig-Mittel Schrittweise Migration von klassischer PKI (RSA/ECDSA) zu Hybrid-Modus (Klassisch + ML-DSA). ---- ===== Übersicht ===== flowchart TB subgraph PHASE1["Phase 1: Vorbereitung"] P1A[Inventur] P1B[Testumgebung] P1C[Tooling Update] end subgraph PHASE2["Phase 2: Infrastruktur"] P2A[Root-CA Hybrid] P2B[Intermediate-CAs] P2C[CRL/OCSP Update] end subgraph PHASE3["Phase 3: Rollout"] P3A[Server-Zertifikate] P3B[Client-Zertifikate] P3C[Code-Signing] end subgraph PHASE4["Phase 4: Validierung"] P4A[Monitoring] P4B[Audit] P4C[Dokumentation] end P1A --> P1B --> P1C --> P2A P2A --> P2B --> P2C --> P3A P3A --> P3B --> P3C --> P4A P4A --> P4B --> P4C style P2A fill:#fff3e0 style P3A fill:#e8f5e9 ---- ===== Phase 1: Vorbereitung (1-2 Monate) ===== ==== 1.1 Inventur durchführen ==== #!/bin/bash # inventory-certs.sh - Zertifikats-Inventur echo "=== Zertifikats-Inventur $(date) ===" > inventory.csv echo "Pfad,Subject,Algorithmus,Schlüsselgröße,Ablauf,Tage" >> inventory.csv # Lokale Zertifikate 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 # Remote Endpoints ENDPOINTS=( "api.example.com:443" "web.example.com:443" "mail.example.com:465" ) for endpoint in "${ENDPOINTS[@]}"; do host=${endpoint%:*} port=${endpoint#*:} cert_info=$(echo | openssl s_client -connect "$endpoint" -servername "$host" 2>/dev/null | openssl x509 -text -noout 2>/dev/null) # ... analog auswerten done echo "Inventur abgeschlossen: inventory.csv" → Details: [[.:inventur|Zertifikats-Inventur]] ==== 1.2 Testumgebung aufbauen ==== # Docker-basierte Test-PKI docker run -d --name test-ca \ -v /test-pki:/pki \ -e OPENSSL_CONF=/pki/openssl.cnf \ alpine/openssl # OpenSSL 3.6 für PQ docker exec test-ca openssl version # OpenSSL 3.6.0 ... # Test: Hybrid-Zertifikat erstellen docker exec test-ca openssl genpkey -algorithm ML-DSA-65 -out /pki/test-mldsa.key ==== 1.3 Tooling Update ==== | Tool | Min. Version | PQ-Support | |------|--------------|------------| | OpenSSL | 3.6.0 | ML-DSA, ML-KEM | | .NET | 9.0+ | Via WvdS.System.Security.Cryptography | | Java | 21+ | Via BouncyCastle 1.78 | | curl | 8.5+ | Hybrid TLS | ---- ===== Phase 2: Infrastruktur (2-3 Monate) ===== ==== 2.1 Root-CA zu Hybrid migrieren ==== **Root-CA Migration ist der kritischste Schritt.** Planen Sie sorgfältig und testen Sie ausgiebig. **Option A: Neue Hybrid Root-CA (empfohlen)** // Neue Hybrid Root-CA erstellen using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP384); var request = new CertificateRequest( "CN=My Organization Root CA - Hybrid, O=My Organization", ecdsa, HashAlgorithmName.SHA384); // CA Extensions request.CertificateExtensions.Add( new X509BasicConstraintsExtension(true, true, 2, true)); request.CertificateExtensions.Add( new X509KeyUsageExtension( X509KeyUsageFlags.KeyCertSign | X509KeyUsageFlags.CrlSign, true)); // Hybrid Self-Signed (ECDSA + ML-DSA) var hybridRoot = request.CreateSelfSigned( DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(25), CryptoMode.Hybrid); // Export File.WriteAllBytes("hybrid-root-ca.pfx", hybridRoot.Export(X509ContentType.Pfx, "secure-password")); **Option B: Cross-Certification (Übergang)** // Alte Root-CA cross-zertifiziert neue Hybrid-CA using var oldRoot = new X509Certificate2("old-root.pfx", "password"); using var newHybridRoot = new X509Certificate2("hybrid-root.pfx", "password"); // Cross-Zertifikat erstellen var crossCertRequest = new CertificateRequest( newHybridRoot.SubjectName, newHybridRoot.GetECDsaPublicKey()!, HashAlgorithmName.SHA384); // Signiert von alter Root var crossCert = crossCertRequest.Create( oldRoot, newHybridRoot.NotBefore, newHybridRoot.NotAfter, newHybridRoot.SerialNumberBytes.ToArray()); ==== 2.2 Intermediate-CAs migrieren ==== # Neue Hybrid Intermediate-CA # 1. Schlüssel generieren openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-384 -out intermediate.key # 2. CSR erstellen openssl req -new -key intermediate.key \ -out intermediate.csr \ -subj "/CN=My Organization Intermediate CA - Hybrid/O=My Organization" # 3. Von Hybrid-Root signieren (mit WvdS) // Intermediate mit Hybrid-Root signieren using var hybridRoot = new X509Certificate2("hybrid-root.pfx", "password"); var intermediateCsr = CertificateRequest.LoadSigningRequest( File.ReadAllBytes("intermediate.csr"), HashAlgorithmName.SHA384); // CA Extensions hinzufügen 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 CRL/OCSP Update ==== // Hybrid-signierte CRL erstellen var crlBuilder = new CertificateRevocationListBuilder(); // Alte CRL-Einträge übernehmen foreach (var entry in existingCrlEntries) { crlBuilder.AddEntry(entry.SerialNumber, entry.RevocationDate, entry.Reason); } // Mit Hybrid-CA signieren byte[] newCrl = crlBuilder.Build( hybridIntermediate, newCrlNumber, DateTimeOffset.UtcNow.AddDays(7), HashAlgorithmName.SHA384, CryptoMode.Hybrid); ---- ===== Phase 3: Rollout (3-6 Monate) ===== ==== 3.1 Server-Zertifikate ==== **Priorität-Matrix:** | Server-Typ | Priorität | Grund | |------------|-----------|-------| | Extern-facing API | Hoch | Höchstes Risiko | | Interne Microservices | Mittel | Laterale Bewegung | | Development | Niedrig | Testumgebung | # Batch-Erneuerung mit Hybrid for server in $(cat servers.txt); do # CSR erstellen ssh "$server" "openssl req -new -key /etc/ssl/private/server.key \ -out /tmp/renew.csr -subj \"/CN=$server\"" # CSR abholen scp "$server:/tmp/renew.csr" "./csrs/$server.csr" # Hybrid-Zertifikat ausstellen (via API oder Script) ./sign-hybrid.sh "./csrs/$server.csr" "./certs/$server.pem" # Zertifikat deployen scp "./certs/$server.pem" "$server:/etc/ssl/certs/server.pem" ssh "$server" "systemctl reload nginx" done ==== 3.2 Client-Zertifikate ==== // Client-Zertifikat mit Hybrid ausstellen 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); ==== 3.3 Code-Signing Zertifikate ==== → Siehe [[..:automatisierung:cicd-code-signing|CI/CD Code-Signing]] für Pipeline-Integration ---- ===== Phase 4: Validierung (1-2 Monate) ===== ==== 4.1 Monitoring aktivieren ==== # Prometheus Alert für Hybrid-Status - alert: NonHybridCertificateInProduction expr: x509_cert_algorithm{env="production"} !~ ".*ML-DSA.*|.*Hybrid.*" for: 24h labels: severity: warning annotations: summary: "Nicht-Hybrid-Zertifikat in Produktion: {{ $labels.filepath }}" ==== 4.2 Checkliste ==== | # | Prüfpunkt | Status | |---|-----------|--------| | 1 | Alle CA-Zertifikate auf Hybrid | ☐ | | 2 | Alle Server-Zertifikate erneut | ☐ | | 3 | CRL/OCSP mit Hybrid signiert | ☐ | | 4 | Trust Stores aktualisiert | ☐ | | 5 | Monitoring zeigt keine Klassisch-Only | ☐ | | 6 | Rollback getestet | ☐ | | 7 | Dokumentation aktualisiert | ☐ | ---- ===== Rollback-Plan ===== **Bei Problemen:** # 1. Zur klassischen CA zurückwechseln export CA_CERT=/etc/pki/CA/classic-intermediate.pem export CA_KEY=/etc/pki/CA/classic-intermediate.key # 2. Zertifikate mit klassischer CA neu ausstellen ./issue-classic.sh # 3. Hybrid-CA-Zertifikate widerrufen (falls nötig) ./revoke-hybrid-certs.sh → Details: [[.:rollback-strategie|Rollback-Strategie]] ---- ===== Verwandte Dokumentation ===== * [[.:parallel-betrieb|Parallel-Betrieb]] – Alternative Strategie * [[.:inventur|Inventur]] – Detaillierte Bestandsaufnahme * [[de:int:pqcrypt:konzepte:start|Krypto-Modi]] – Hybrid erklärt ---- << [[.:start|← Migration]] | [[.:parallel-betrieb|→ Parallel-Betrieb]] >> ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional// {{tag>migration hybrid classic upgrade operator}}