~~NOTOC~~
====== Scenarij 10.4: Hybrid TLS ======
**Kategorija:** [[.:start|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:**
* **Hybrid Key Exchange** - X25519 + ML-KEM-768
* **Hybrid Signature** - ECDSA + ML-DSA-65
* **Dual Certificates** - Klasični + PQ certifikat
**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.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 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** | [[.:server_setup|10.1 TLS server]] | Osnovno postavljanje |
| **Preduvjet** | [[.:mtls_deployment|10.3 mTLS Deployment]] | mTLS infrastruktura |
| **Povezano** | [[hr:int:pqcrypt:szenarien:verschluesselung:key_encapsulation|7.2 Key Encapsulation]] | ML-KEM |
| **Povezano** | [[hr:int:pqcrypt:konzepte:algorithmen|Algoritmi]] | PQ osnove |
----
<< [[.:mtls_deployment|← 10.3 mTLS Deployment]] | [[.:start|↑ Pregled TLS-a]] | [[hr:int:pqcrypt:szenarien:start|→ Svi scenariji]] >>
{{tag>scenarij tls hybrid post-quantum ml-kem ml-dsa openssl}}
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//