Prva hibridna veriga potrdil
Za izmišljeno podjetje Vzorec d.o.o. izdate hibridno korensko potrdilo, z njim izdate strežniško potrdilo za
www.example.com in verigo preverite dvakrat: enkrat tako, kot jo preveri vsaka obstoječa programska
oprema, in enkrat skupaj s postkvantnim delom. »Hibridno« pomeni, da vsako potrdilo poleg običajnega podpisa
RSA nosi še podpis ML-DSA. Programska oprema, ki PQ ne pozna, vidi običajno potrdilo RSA.
Predpogoji
- .NET 8 SDK ali novejši za izvajanje primera, .NET 10 SDK za prevajanje knjižnice.
- OpenSSL 3.5 ali novejši za arhitekturo procesa, glejte Predpogoji.
- Neobvezno, za navzkrižno preverjanje v 6. koraku: katero koli orodje ukazne vrstice OpenSSL, različica 3.0 ali novejša.
Koraki
1. korak: Ustvarite projekt in vključite knjižnico
dotnet new console -n VzorecPki -f net8.0 cd VzorecPki dotnet add reference ..\sys-sec-crypto\WKL.System.Security.Cryptography.Extensions.csproj
Pot prilagodite mestu, kjer je izvorna koda knjižnice.
2. korak: Vključite OpenSSL in vklopite hibridni način
Vsebino datoteke Program.cs zamenjajte z:
using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using WKL.System.Security.Cryptography; using WKL.System.Security.Cryptography.X509Certificates; PostQuantumConfig.OpenSslPath = @"C:\OpenSSL\bin"; PostQuantumConfig.EnablePostQuantum(CryptoMode.Hybrid); Console.WriteLine(PostQuantumConfig.GetOpenSslVersion());
OpenSslPath je mapa z datoteko libcrypto. EnablePostQuantum naloži OpenSSL in sproži
CryptographicException, če ga ni ali če ne ponuja ML-DSA in ML-KEM. Knjižnica torej nikoli neopazno ne
nadaljuje brez dela PQ.
Preverjanje: dotnet run izpiše različico OpenSSL, na primer OpenSSL 3.6.1 27 Jan 2026.
3. korak: Izdajte hibridno korensko potrdilo
Dodajte:
using var rootKey = RSA.Create(3072); var rootRequest = new CertificateRequest( "CN=Vzorec Root CA", rootKey, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); rootRequest.CertificateExtensions.Add(new X509BasicConstraintsExtension(true, false, 0, true)); rootRequest.CertificateExtensions.Add( new X509KeyUsageExtension(X509KeyUsageFlags.KeyCertSign | X509KeyUsageFlags.CrlSign, true)); using var root = rootRequest.CreateSelfSigned( DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(5), CryptoMode.Hybrid); Console.WriteLine(root.GetSignatureAlgorithmDescription());
To je klic .NET z enim dodatnim argumentom. Brez CryptoMode.Hybrid bi nastalo običajno potrdilo RSA.
Knjižnica za potrdilo ustvari par ključev ML-DSA-65 in zasebni ključ hrani v pomnilniku, dokler proces teče.
Preverjanje: Izpis je sha256RSA + ML-DSA-65 (Hybrid).
4. korak: Izdajte strežniško potrdilo
using var leafKey = RSA.Create(2048); var leafRequest = new CertificateRequest( "CN=www.example.com", leafKey, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); using var leaf = leafRequest.Create( root, DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(1), RandomNumberGenerator.GetBytes(16), CryptoMode.Hybrid); using var server = leaf.CopyWithPrivateKey(leafKey); Console.WriteLine(server.HasPqSignature());
Korensko potrdilo podpiše s svojim ključem RSA in s ključem ML-DSA iz 3. koraka. Če tega ključa v procesu
ni, na primer ker je bilo korensko potrdilo naloženo iz datoteke PEM namesto iz datoteke PFX, klic ne uspe s
CryptographicException, ki navede izdajatelja.
Preverjanje: Izpis je True.
5. korak: Preverite verigo skupaj s postkvantnim delom
using var chain = new X509Chain(); chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust; chain.ChainPolicy.CustomTrustStore.Add(root); chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; bool valid = chain.Build(server, CryptoMode.Hybrid); Console.WriteLine($"Veriga veljavna: {valid}"); foreach (var element in chain.GetValidationReport().Elements) { Console.WriteLine($"{element.Subject}: {element.PqSignatureStatus}"); } File.WriteAllText("root.pem", root.ExportCertificatePem()); File.WriteAllText("server.pem", server.ExportCertificatePem());
Build s CryptoMode.Hybrid najprej izvede običajno preverjanje .NET in nato preveri vsak podpis ML-DSA v
verigi. Neveljaven podpis vrne false, enako kot v .NET; klasični razlog navede chain.ChainStatus,
rezultat PQ za vsako potrdilo pa GetValidationReport().
Preverjanje: Izpis je:
Veriga veljavna: True CN=www.example.com: Valid CN=Vzorec Root CA: Valid
6. korak: Navzkrižno preverite s klasičnim preverjevalnikom
openssl verify -CAfile root.pem server.pem
OpenSSL preveri podpisa RSA in prezre nekritični razširitvi z delom PQ.
Preverjanje: Izpis je server.pem: OK.
Pričakovani rezultat
Imate dve potrdili, ki ju vsaka obstoječa programska oprema sprejme kot potrdili RSA in katerih podpise ML-DSA knjižnica dodatno preveri. Zasebna ključa ML-DSA obstajata samo v procesu, ki teče. Da ju trajno ohranite, potrdilo izvozite kot datoteko PFX.