Scenarij 10.4: Hibridni TLS

Kategorija: TLS/mTLS
Kompleksnost: ⭐⭐⭐⭐⭐ (Zelo visoka)
Predpogoji: OpenSSL 3.6+, PQ certifikati
Predviden čas: 45-60 minut


Opis

Ta scenarij opisuje hibridni TLS - kombinacijo klasičnih in postkvantnih algoritmov v TLS rokovanju za maksimalno varnost v prehodnem obdobju.

Hibridni pristopi:

  • Hibridna izmenjava ključev - X25519 + ML-KEM-768
  • Hibridni podpis - ECDSA + ML-DSA-65
  • Dvojni certifikati - Klasični + PQ certifikat

Zakaj hibridno? Če je en algoritem prelomljen (klasični s kvantnim računalnikom, PQ z novimi napadi), povezava ostane varna prek drugega.


TLS 1.3 hibridna izmenjava ključev

sequenceDiagram participant Client as Odjemalec participant Server as Strežnik Client->>Server: ClientHello + key_share(X25519 + ML-KEM-768) Server->>Client: ServerHello + key_share(X25519 + ML-KEM-768) Note over Client,Server: Kombinacija obeh deljenih skrivnosti Client->>Server: Finished Server->>Client: Finished Note over Client,Server: Hibridno zavarovana povezava


Primer kode: Hibridni TLS z OpenSSL 3.6

using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
using System.Runtime.InteropServices;
 
// OpenSSL 3.6 hibridne skupine za izmenjavo ključev
public static class HybridTlsConfig
{
    // Hibridne skupine za izmenjavo ključev (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 skupin (vrstni red prednosti)
        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 izmenjave ključev ni uspela");
        }
    }
}

ASP.NET Core hibridni TLS strežnik

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();
 
            // Zahtevanje TLS 1.3 (predpogoj za hibridno)
            httpsOptions.SslProtocols = SslProtocols.Tls13;
 
            // OpenSSL konfiguracija za hibridno izmenjavo ključev
            httpsOptions.OnAuthenticate = (context, sslOptions) =>
            {
                // Šifrirni nabori za TLS 1.3
                sslOptions.CipherSuitesPolicy = new CipherSuitesPolicy(new[]
                {
                    TlsCipherSuite.TLS_AES_256_GCM_SHA384,
                    TlsCipherSuite.TLS_CHACHA20_POLY1305_SHA256
                });
 
                // Pogajanje o protokolu aplikacijske plasti
                sslOptions.ApplicationProtocols = new List<SslApplicationProtocol>
                {
                    SslApplicationProtocol.Http2,
                    SslApplicationProtocol.Http11
                };
            };
        });
 
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
    });
});
 
X509Certificate2 LoadHybridCertificate()
{
    using var ctx = PqCryptoContext.Initialize();
 
    // Dvojni certifikat z obema algoritmoma
    var cert = ctx.LoadCertificateWithPrivateKey(
        "server-hybrid.crt.pem",
        "server-hybrid.key.pem",
        "Password!"
    );
 
    return cert;
}

Ustvarjanje hibridnega certifikata

public class HybridCertificateBuilder
{
    public X509Certificate2 CreateHybridServerCertificate(
        X509Certificate2 caCert,
        AsymmetricAlgorithm caKey,
        string[] dnsNames)
    {
        using var ctx = PqCryptoContext.Initialize();
 
        // Dvojni 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 z obema ključema
        var csr = ctx.CreateHybridCertificateRequest(
            classicalKey: ecdsaKey,
            pqKey: mlDsaKey,
            subject: dn,
            extensions: new ExtBuilder()
                .SubjectAlternativeName(dnsNames.Select(d => $"dns:{d}").ToArray())
                .Build()
        );
 
        // Izdaja hibridnega 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 razširitev
                .AddCustomExtension(
                    oid: "1.3.6.1.4.1.99999.1.1",  // Primer OID
                    critical: false,
                    value: "hybrid:ecdsa-p384+ml-dsa-65"
                )
                .Build()
        );
 
        return cert;
    }
}

Nginx z OpenSSL 3.6 hibridno

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;
 
    # Hibridne skupine za izmenjavo ključev (OpenSSL 3.6+)
    ssl_ecdh_curve x25519_mlkem768:secp384r1_mlkem768:X25519:secp384r1;
 
    # Podpisni algoritmi (hibridni)
    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;
    }
}

Konfiguracija hibridnega odjemalca

public HttpClient CreateHybridTlsClient()
{
    var handler = new SocketsHttpHandler
    {
        SslOptions = new SslClientAuthenticationOptions
        {
            EnabledSslProtocols = SslProtocols.Tls13,
 
            // Šifrirni nabori (TLS 1.3 privzeti dobri)
            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 napaka: {errors}");
                    return false;
                }
 
                // Preverjanje hibridnega podpisa
                if (certificate is X509Certificate2 cert2)
                {
                    var algorithm = cert2.SignatureAlgorithm.FriendlyName;
                    Console.WriteLine($"Podpisni algoritem strežnika: {algorithm}");
 
                    // Preverjanje ali se uporablja PQ algoritem
                    if (!algorithm.Contains("ML-DSA") && !algorithm.Contains("hybrid"))
                    {
                        Console.WriteLine("OPOZORILO: Strežnik ne uporablja PQ certifikata");
                    }
                }
 
                return true;
            }
        }
    };
 
    return new HttpClient(handler);
}

Strategija nadomestka

public class HybridTlsClientWithFallback
{
    public async Task<HttpResponseMessage> GetWithFallback(string url)
    {
        // Poskus 1: Hibridni TLS
        try
        {
            using var hybridClient = CreateHybridTlsClient();
            return await hybridClient.GetAsync(url);
        }
        catch (AuthenticationException ex) when (IsHybridNotSupported(ex))
        {
            Console.WriteLine("Hibridni TLS ni podprt, nadomestek na klasični...");
        }
 
        // Nadomestek: 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);
    }
}

Matrika združljivosti

Komponenta Hibridna izmenjava ključev Hibridni podpis
OpenSSL 3.6+ Da Da
BoringSSL Da (eksperimentalno) Ne
Windows SChannel Ne (še ne) Ne
NSS (Firefox) Da (ML-KEM) Ne
.NET 9+ Da (z OpenSSL) Da

Panožne hibridne zahteve

Panoga Časovnica Zahteva
BSI TR-02102 Od 2025 Hibridno priporočeno
NIST Od 2024 ML-KEM za izmenjavo ključev
Finance (PCI) 2025-2027 Načrt migracije na PQ
Vlada Od 2025 Hibridno obvezno (US NSA CNSA 2.0)

Povezani scenariji

Povezava Scenarij Opis
Predpogoj 10.1 TLS strežnik Osnovna nastavitev
Predpogoj 10.3 Uvajanje mTLS mTLS infrastruktura
Povezano 7.2 Enkapsulacija ključev ML-KEM
Povezano Algoritmi PQ osnove

« ← 10.3 Uvajanje mTLS | ↑ Pregled TLS | → Vsi scenariji »


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

Zuletzt geändert: dne 30.01.2026 ob 06:47