Scenarij 10.4: Hybrid TLS

Kategorija: TLS/mTLS
Složenost: ⭐⭐⭐⭐⭐ (Vrlo visoka)
Preduvjeti: OpenSSL 3.6+, PQ certifikati
Procijenjeno vrijeme: 45-60 minuta


Opis

Ovaj scenarij opisuje Hybrid TLS - kombinaciju klasičnih i Post-Quantum algoritama u TLS handshake-u za maksimalnu sigurnost u prijelaznom razdoblju.

Hibridni pristupi:

Zašto hibridno? Ako se jedan algoritam probije (klasični kvantnim računalom, PQ novim napadima), veza ostaje sigurna putem drugog.


TLS 1.3 Hybrid Key Exchange

sequenceDiagram participant Klijent participant Server Klijent->>Server: ClientHello + key_share(X25519 + ML-KEM-768) Server->>Klijent: ServerHello + key_share(X25519 + ML-KEM-768) Note over Klijent,Server: Kombiniranje oba dijeljenja tajni Klijent->>Server: Finished Server->>Klijent: Finished Note over Klijent,Server: Hibridno osigurana veza


Primjer koda: Hybrid TLS s OpenSSL 3.6

using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
using System.Runtime.InteropServices;
 
// OpenSSL 3.6 Hybrid grupe za Key Exchange
public static class HybridTlsConfig
{
    // Hybrid Key Exchange grupe (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)
    {
        // Konfiguracija hibridnih grupa (redoslijed preferencije)
        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("Konfiguracija hibridne razmjene ključeva neuspješna");
        }
    }
}

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 =>
        {
            // Hibridni certifikat (ML-DSA + ECDSA)
            httpsOptions.ServerCertificate = LoadHybridCertificate();
 
            // Forsiranje TLS 1.3 (preduvjet za Hybrid)
            httpsOptions.SslProtocols = SslProtocols.Tls13;
 
            // OpenSSL konfiguracija za Hybrid Key Exchange
            httpsOptions.OnAuthenticate = (context, sslOptions) =>
            {
                // Cipher Suites za 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>
                {
                    SslApplicationProtocol.Http2,
                    SslApplicationProtocol.Http11
                };
            };
        });
 
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
    });
});
 
X509Certificate2 LoadHybridCertificate()
{
    using var ctx = PqCryptoContext.Initialize();
 
    // Dual certifikat s oba algoritma
    var cert = ctx.LoadCertificateWithPrivateKey(
        "server-hybrid.crt.pem",
        "server-hybrid.key.pem",
        "Password!"
    );
 
    return cert;
}

Kreiranje hibridnog certifikata

public class HybridCertificateBuilder
{
    public X509Certificate2 CreateHybridServerCertificate(
        X509Certificate2 caCert,
        AsymmetricAlgorithm caKey,
        string[] dnsNames)
    {
        using var ctx = PqCryptoContext.Initialize();
 
        // Dual ključ: 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 s oba ključa
        var csr = ctx.CreateHybridCertificateRequest(
            classicalKey: ecdsaKey,
            pqKey: mlDsaKey,
            subject: dn,
            extensions: new ExtBuilder()
                .SubjectAlternativeName(dnsNames.Select(d => $"dns:{d}").ToArray())
                .Build()
        );
 
        // Izdavanje hibridnog certifikata
        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)
                // Hibridno-specifična ekstenzija
                .AddCustomExtension(
                    oid: "1.3.6.1.4.1.99999.1.1",  // Primjer OID
                    critical: false,
                    value: "hybrid:ecdsa-p384+ml-dsa-65"
                )
                .Build()
        );
 
        return cert;
    }
}

Nginx s OpenSSL 3.6 Hybrid

server {
    listen 443 ssl http2;
    server_name www.example.com;
 
    # Hibridni certifikat
    ssl_certificate     /etc/nginx/ssl/server-hybrid-chain.pem;
    ssl_certificate_key /etc/nginx/ssl/server-hybrid.key.pem;
 
    # Samo TLS 1.3
    ssl_protocols TLSv1.3;
 
    # Hybrid Key Exchange grupe (OpenSSL 3.6+)
    ssl_ecdh_curve x25519_mlkem768:secp384r1_mlkem768:X25519:secp384r1;
 
    # Algoritmi potpisa (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;
    }
}

Hibridna konfiguracija klijenta

public HttpClient CreateHybridTlsClient()
{
    var handler = new SocketsHttpHandler
    {
        SslOptions = new SslClientAuthenticationOptions
        {
            EnabledSslProtocols = SslProtocols.Tls13,
 
            // Cipher Suites (TLS 1.3 default dobar)
            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 greška: {errors}");
                    return false;
                }
 
                // Provjera hibridnog potpisa
                if (certificate is X509Certificate2 cert2)
                {
                    var algorithm = cert2.SignatureAlgorithm.FriendlyName;
                    Console.WriteLine($"Server algoritam potpisa: {algorithm}");
 
                    // Provjera koristi li se PQ algoritam
                    if (!algorithm.Contains("ML-DSA") && !algorithm.Contains("hybrid"))
                    {
                        Console.WriteLine("UPOZORENJE: Server ne koristi PQ certifikat");
                    }
                }
 
                return true;
            }
        }
    };
 
    return new HttpClient(handler);
}

Fallback strategija

public class HybridTlsClientWithFallback
{
    public async Task<HttpResponseMessage> GetWithFallback(string url)
    {
        // Pokušaj 1: Hybrid TLS
        try
        {
            using var hybridClient = CreateHybridTlsClient();
            return await hybridClient.GetAsync(url);
        }
        catch (AuthenticationException ex) when (IsHybridNotSupported(ex))
        {
            Console.WriteLine("Hybrid TLS nije podržan, fallback na klasični...");
        }
 
        // Fallback: Klasični 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);
    }
}

Matrica kompatibilnosti

Komponenta Hybrid Key Exchange Hybrid Signature
OpenSSL 3.6+
BoringSSL ✅ (eksperimentalno)
Windows SChannel ❌ (još ne)
NSS (Firefox) ✅ (ML-KEM)
.NET 9+ ✅ (s OpenSSL)

Sektorski specifični hibridni zahtjevi

Sektor Vremenski okvir Zahtjev
BSI TR-02102 Od 2025. Hybrid preporučen
NIST Od 2024. ML-KEM za Key Exchange
Financije (PCI) 2025.-2027. PQ migracijska roadmapa
Vlade Od 2025. Hybrid obavezan (US NSA CNSA 2.0)

Povezani scenariji

Odnos Scenarij Opis
Preduvjet 10.1 TLS server Osnovno postavljanje
Preduvjet 10.3 mTLS Deployment mTLS infrastruktura
Povezano 7.2 Key Encapsulation ML-KEM
Povezano Algoritmi PQ osnove

« ← 10.3 mTLS Deployment | ↑ Pregled TLS-a | → Svi scenariji »


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