Barvna shema: Temna
Trenutno dejavna stran: start » sl » Dokumentacija » Postkvantna kriptografija » WKL.System.Security.Cryptography – pregled » Navodila » Ustvarjanje zahtevka za potrdilo

Ustvarjanje zahtevka za potrdilo

Strežnik naj od overitelja prejme hibridno potrdilo, ne da bi njegovi zasebni ključi zapustili strežnik. Strežnik zato ustvari zahtevek za potrdilo (PKCS #10), overitelj pa iz njega izda potrdilo.

Pregled rešitve

StranElementNamen
ProsilecCertificateRequest.CreateSigningRequest s CryptoMode.Hybridzahtevek s ključem RSA in ključem ML-DSA, oba dokaza posesti podpisana
OveriteljX509CertificateBuilder.LoadSigningRequestprebere zahtevek in preveri oba podpisa
OveriteljX509CertificateBuilder.Create s CryptoMode.Hybridizda hibridno potrdilo
ProsilecCopyWithPrivateKey, AttachAlternativePrivateMLDsaKeypoveže potrdilo z obema zasebnima ključema

Izvedba

Na strežniku:

using var serverRsa = RSA.Create(3072);
using var serverPq = MLDsaKey.Generate(MLDsaParameterSet.MLDsa65);
var request = new CertificateRequest(
    "CN=www.example.com", serverRsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
 
byte[] csr = request.CreateSigningRequest(CryptoMode.Hybrid, serverPq);
File.WriteAllBytes("www.example.com.csr", csr);

Pri overitelju; ca je hibridno potrdilo izdajatelja, katerega ključa RSA in ML-DSA sta v procesu, na primer po uvozu PFX:

using var caKey = RSA.Create(3072);
var caRequest = new CertificateRequest(
    "CN=Vzorec Hybrid CA", caKey, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
caRequest.CertificateExtensions.Add(new X509BasicConstraintsExtension(true, false, 0, true));
caRequest.CertificateExtensions.Add(
    new X509KeyUsageExtension(X509KeyUsageFlags.KeyCertSign | X509KeyUsageFlags.CrlSign, true));
using var ca = caRequest.CreateSelfSigned(
    DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(5), CryptoMode.Hybrid);
 
var incoming = X509CertificateBuilder.LoadSigningRequest(
    File.ReadAllBytes("www.example.com.csr"), HashAlgorithmName.SHA256,
    signerSignaturePadding: RSASignaturePadding.Pkcs1, mode: CryptoMode.Hybrid);
incoming.CertificateExtensions.Add(new X509KeyUsageExtension(
    X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.KeyEncipherment, true));
 
using var issued = incoming.Create(
    ca, DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(1),
    RandomNumberGenerator.GetBytes(16), CryptoMode.Hybrid);
File.WriteAllText("www.example.com.pem", issued.ExportCertificatePem());

Nazaj na strežniku:

using var certificate = X509Certificate2.CreateFromPem(File.ReadAllText("www.example.com.pem"));
using var server = certificate.CopyWithPrivateKey(serverRsa);
server.AttachAlternativePrivateMLDsaKey(serverPq);

Opombe

  • Preverjena sta oba dokaza posesti. LoadSigningRequest s CryptoMode.Hybrid preveri podpis RSA in podpis ML-DSA zahtevka. Če je eden od njiju neveljaven, metoda sproži CryptographicException.
  • Ključ ML-DSA izvira iz zahtevka. Izdano potrdilo nosi natanko javni ključ ML-DSA prosilca. Overitelj lastnega ključa ne ustvari.
  • Ključ ML-DSA ustvarite sami. Brez argumenta serverPq CreateSigningRequest ustvari ključ, do katerega pozneje ne pridete več. Zato vedno podajte lasten ključ.
  • Zasebni ključ ML-DSA shranite. Strežnik serverPq znova potrebuje, ko potrdilo prispe. Ključ do takrat hranite, na primer z ExportPkcs8PrivateKey v zaščiteni datoteki, končano potrdilo pa nato prenesite kot datoteko PFX.
  • Čisti zahtevek ML-DSA. S CryptoMode.PostQuantum in zahtevkom iz MLDsaX509SignatureGenerator.CreateCertificateRequest nastane zahtevek, ki vsebuje samo ML-DSA. Kot vsaka operacija v načinu PostQuantum potrebuje PostQuantumExemptions.PurePostQuantum; glejte Pravila za postkvantne postopke.

Sorodne teme

sl/wiki/pqcrypt/lib/how-to/request-certificates.txt · Zadnja sprememba: uporabnika Wolfgang van der Stille