~~NOTOC~~ ====== Szenario 10.4: Hybrid TLS ====== **Kategorie:** [[.:start|TLS/mTLS]] \\ **Komplexität:** ⭐⭐⭐⭐⭐ (Sehr Hoch) \\ **Voraussetzungen:** OpenSSL 3.6+, PQ-Zertifikate \\ **Geschätzte Zeit:** 45-60 Minuten ---- ===== Beschreibung ===== Dieses Szenario beschreibt **Hybrid TLS** - die Kombination von klassischen und Post-Quantum-Algorithmen im TLS-Handshake für maximale Sicherheit in der Übergangsphase. **Hybrid-Ansätze:** * **Hybrid Key Exchange** - X25519 + ML-KEM-768 * **Hybrid Signature** - ECDSA + ML-DSA-65 * **Dual Certificates** - Klassisches + PQ-Zertifikat **Warum Hybrid?** Falls ein Algorithmus gebrochen wird (klassisch durch Quantencomputer, PQ durch neue Angriffe), bleibt die Verbindung durch den anderen sicher. ---- ===== TLS 1.3 Hybrid Key Exchange ===== sequenceDiagram participant Client participant Server Client->>Server: ClientHello + key_share(X25519 + ML-KEM-768) Server->>Client: ServerHello + key_share(X25519 + ML-KEM-768) Note over Client,Server: Beide Shared Secrets kombinieren Client->>Server: Finished Server->>Client: Finished Note over Client,Server: Hybrid-gesicherte Verbindung ---- ===== Code-Beispiel: Hybrid TLS mit OpenSSL 3.6 ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using System.Runtime.InteropServices; // OpenSSL 3.6 Hybrid Groups für Key Exchange public static class HybridTlsConfig { // Hybrid Key Exchange Groups (OpenSSL 3.6+) public const string HYBRID_X25519_MLKEM768 = "x25519_mlkem768"; public const string HYBRID_SECP384R1_MLKEM768 = "secp384r1_mlkem768"; public const string HYBRID_SECP256R1_MLKEM512 = "secp256r1_mlkem512"; [DllImport("libssl")] private static extern int SSL_CTX_set1_groups_list(IntPtr ctx, string groups); public static void ConfigureHybridKeyExchange(IntPtr sslContext) { // Hybrid Groups konfigurieren (Präferenz-Reihenfolge) var groups = $"{HYBRID_X25519_MLKEM768}:{HYBRID_SECP384R1_MLKEM768}:X25519:secp384r1"; int result = SSL_CTX_set1_groups_list(sslContext, groups); if (result != 1) { throw new CryptographicException("Failed to configure hybrid key exchange"); } } } ---- ===== ASP.NET Core Hybrid TLS Server ===== using Microsoft.AspNetCore.Server.Kestrel.Core; using System.Security.Authentication; var builder = WebApplication.CreateBuilder(args); builder.WebHost.ConfigureKestrel(options => { options.ListenAnyIP(443, listenOptions => { listenOptions.UseHttps(httpsOptions => { // Hybrid-Zertifikat (ML-DSA + ECDSA) httpsOptions.ServerCertificate = LoadHybridCertificate(); // TLS 1.3 erzwingen (Voraussetzung für Hybrid) httpsOptions.SslProtocols = SslProtocols.Tls13; // OpenSSL-Konfiguration für Hybrid Key Exchange httpsOptions.OnAuthenticate = (context, sslOptions) => { // Cipher Suites für TLS 1.3 sslOptions.CipherSuitesPolicy = new CipherSuitesPolicy(new[] { TlsCipherSuite.TLS_AES_256_GCM_SHA384, TlsCipherSuite.TLS_CHACHA20_POLY1305_SHA256 }); // Application-Layer Protocol Negotiation sslOptions.ApplicationProtocols = new List { SslApplicationProtocol.Http2, SslApplicationProtocol.Http11 }; }; }); listenOptions.Protocols = HttpProtocols.Http1AndHttp2; }); }); X509Certificate2 LoadHybridCertificate() { using var ctx = PqCryptoContext.Initialize(); // Dual-Zertifikat mit beiden Algorithmen var cert = ctx.LoadCertificateWithPrivateKey( "server-hybrid.crt.pem", "server-hybrid.key.pem", "Password!" ); return cert; } ---- ===== Hybrid-Zertifikat erstellen ===== public class HybridCertificateBuilder { public X509Certificate2 CreateHybridServerCertificate( X509Certificate2 caCert, AsymmetricAlgorithm caKey, string[] dnsNames) { using var ctx = PqCryptoContext.Initialize(); // Dual Key: ECDSA + ML-DSA using var ecdsaKey = ECDsa.Create(ECCurve.NamedCurves.nistP384); using var mlDsaKey = ctx.GenerateKeyPair(PqAlgorithm.MlDsa65); var dn = new DnBuilder() .AddCN(dnsNames[0]) .AddO("Example GmbH") .Build(); // CSR mit beiden Schlüsseln var csr = ctx.CreateHybridCertificateRequest( classicalKey: ecdsaKey, pqKey: mlDsaKey, subject: dn, extensions: new ExtBuilder() .SubjectAlternativeName(dnsNames.Select(d => $"dns:{d}").ToArray()) .Build() ); // Hybrid-Zertifikat ausstellen var cert = ctx.IssueHybridCertificate( csr, issuerCert: caCert, issuerKey: caKey, validDays: 365, extensions: new ExtBuilder() .BasicConstraints(ca: false, critical: true) .KeyUsage(KeyUsageFlags.DigitalSignature | KeyUsageFlags.KeyEncipherment) .ExtendedKeyUsage(ExtKeyUsage.ServerAuth) .SubjectKeyIdentifier(mlDsaKey.PublicKey) .AuthorityKeyIdentifier(caCert) // Hybrid-spezifische Extension .AddCustomExtension( oid: "1.3.6.1.4.1.99999.1.1", // Beispiel-OID critical: false, value: "hybrid:ecdsa-p384+ml-dsa-65" ) .Build() ); return cert; } } ---- ===== Nginx mit OpenSSL 3.6 Hybrid ===== server { listen 443 ssl http2; server_name www.example.com; # Hybrid-Zertifikat ssl_certificate /etc/nginx/ssl/server-hybrid-chain.pem; ssl_certificate_key /etc/nginx/ssl/server-hybrid.key.pem; # TLS 1.3 only ssl_protocols TLSv1.3; # Hybrid Key Exchange Groups (OpenSSL 3.6+) ssl_ecdh_curve x25519_mlkem768:secp384r1_mlkem768:X25519:secp384r1; # Signature Algorithms (Hybrid) ssl_conf_command SignatureAlgorithms ed25519:ecdsa_secp384r1_sha384:mldsa65:hybrid_mldsa65_ecdsa_p384; # OCSP Stapling ssl_stapling on; ssl_stapling_verify on; location / { proxy_pass http://backend:8080; } } ---- ===== Hybrid Client-Konfiguration ===== public HttpClient CreateHybridTlsClient() { var handler = new SocketsHttpHandler { SslOptions = new SslClientAuthenticationOptions { EnabledSslProtocols = SslProtocols.Tls13, // Cipher Suites (TLS 1.3 default gut) CipherSuitesPolicy = new CipherSuitesPolicy(new[] { TlsCipherSuite.TLS_AES_256_GCM_SHA384, TlsCipherSuite.TLS_CHACHA20_POLY1305_SHA256 }), RemoteCertificateValidationCallback = (sender, certificate, chain, errors) => { if (errors != SslPolicyErrors.None) { Console.WriteLine($"TLS Error: {errors}"); return false; } // Hybrid-Signatur prüfen if (certificate is X509Certificate2 cert2) { var algorithm = cert2.SignatureAlgorithm.FriendlyName; Console.WriteLine($"Server Signature Algorithm: {algorithm}"); // Prüfen ob PQ-Algorithmus verwendet wird if (!algorithm.Contains("ML-DSA") && !algorithm.Contains("hybrid")) { Console.WriteLine("WARNING: Server verwendet kein PQ-Zertifikat"); } } return true; } } }; return new HttpClient(handler); } ---- ===== Fallback-Strategie ===== public class HybridTlsClientWithFallback { public async Task GetWithFallback(string url) { // Versuch 1: Hybrid TLS try { using var hybridClient = CreateHybridTlsClient(); return await hybridClient.GetAsync(url); } catch (AuthenticationException ex) when (IsHybridNotSupported(ex)) { Console.WriteLine("Hybrid TLS nicht unterstützt, Fallback auf klassisch..."); } // Fallback: Klassisches TLS 1.3 using var classicClient = CreateClassicTlsClient(); return await classicClient.GetAsync(url); } private bool IsHybridNotSupported(Exception ex) { return ex.Message.Contains("no common signature algorithm") || ex.Message.Contains("unsupported group"); } private HttpClient CreateClassicTlsClient() { var handler = new HttpClientHandler { SslProtocols = SslProtocols.Tls13 }; return new HttpClient(handler); } } ---- ===== Kompatibilitätsmatrix ===== ^ Komponente ^ Hybrid Key Exchange ^ Hybrid Signature ^ | OpenSSL 3.6+ | ✅ | ✅ | | BoringSSL | ✅ (experimentell) | ❌ | | Windows SChannel | ❌ (noch nicht) | ❌ | | NSS (Firefox) | ✅ (ML-KEM) | ❌ | | .NET 9+ | ✅ (mit OpenSSL) | ✅ | ---- ===== Branchenspezifische Hybrid-Anforderungen ===== ^ Branche ^ Timeline ^ Anforderung ^ | **BSI TR-02102** | Ab 2025 | Hybrid empfohlen | | **NIST** | Ab 2024 | ML-KEM für Key Exchange | | **Finanz (PCI)** | 2025-2027 | PQ-Migration Roadmap | | **Government** | Ab 2025 | Hybrid Pflicht (US NSA CNSA 2.0) | ---- ===== Verwandte Szenarien ===== ^ Beziehung ^ Szenario ^ Beschreibung ^ | **Voraussetzung** | [[.:server_setup|10.1 TLS-Server]] | Basis-Setup | | **Voraussetzung** | [[.:mtls_deployment|10.3 mTLS Deployment]] | mTLS-Infrastruktur | | **Verwandt** | [[de:int:pqcrypt:szenarien:verschluesselung:key_encapsulation|7.2 Key Encapsulation]] | ML-KEM | | **Verwandt** | [[de:int:pqcrypt:konzepte:algorithmen|Algorithmen]] | PQ-Grundlagen | ---- << [[.:mtls_deployment|← 10.3 mTLS Deployment]] | [[.:start|↑ TLS-Übersicht]] | [[de:int:pqcrypt:szenarien:start|→ Alle Szenarien]] >> {{tag>szenario tls hybrid post-quantum ml-kem ml-dsa openssl}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//