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
| Stran | Element | Namen |
|---|---|---|
| Prosilec | CertificateRequest.CreateSigningRequest s CryptoMode.Hybrid | zahtevek s ključem RSA in ključem ML-DSA, oba dokaza posesti podpisana |
| Overitelj | X509CertificateBuilder.LoadSigningRequest | prebere zahtevek in preveri oba podpisa |
| Overitelj | X509CertificateBuilder.Create s CryptoMode.Hybrid | izda hibridno potrdilo |
| Prosilec | CopyWithPrivateKey, AttachAlternativePrivateMLDsaKey | povež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.
LoadSigningRequestsCryptoMode.Hybridpreveri podpis RSA in podpis ML-DSA zahtevka. Če je eden od njiju neveljaven, metoda sprožiCryptographicException. - 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
serverPqCreateSigningRequestustvari ključ, do katerega pozneje ne pridete več. Zato vedno podajte lasten ključ. - Zasebni ključ ML-DSA shranite. Strežnik
serverPqznova potrebuje, ko potrdilo prispe. Ključ do takrat hranite, na primer zExportPkcs8PrivateKeyv zaščiteni datoteki, končano potrdilo pa nato prenesite kot datoteko PFX. - Čisti zahtevek ML-DSA. S
CryptoMode.PostQuantumin zahtevkom izMLDsaX509SignatureGenerator.CreateCertificateRequestnastane zahtevek, ki vsebuje samo ML-DSA. Kot vsaka operacija v načinuPostQuantumpotrebujePostQuantumExemptions.PurePostQuantum; glejte Pravila za postkvantne postopke.
Sorodne teme
sl/wiki/pqcrypt/lib/how-to/request-certificates.txt · Zadnja sprememba: uporabnika Wolfgang van der Stille