So erstellen Sie eine Zertifikatsanforderung
Ein Server soll ein hybrides Zertifikat von einer Zertifizierungsstelle erhalten, ohne dass seine privaten Schlüssel den Server verlassen. Der Server erzeugt dazu eine Zertifikatsanforderung (PKCS#10), die Zertifizierungsstelle stellt daraus das Zertifikat aus.
Lösungsübersicht
| Seite | Element | Zweck |
|---|---|---|
| Antragsteller | CertificateRequest.CreateSigningRequest mit CryptoMode.Hybrid | Anforderung mit RSA- und ML-DSA-Schlüssel, beide Besitznachweise signiert |
| Zertifizierungsstelle | X509CertificateBuilder.LoadSigningRequest | liest die Anforderung und prüft beide Signaturen |
| Zertifizierungsstelle | X509CertificateBuilder.Create mit CryptoMode.Hybrid | stellt das hybride Zertifikat aus |
| Antragsteller | CopyWithPrivateKey, AttachAlternativePrivateMLDsaKey | verbindet das Zertifikat mit seinen beiden privaten Schlüsseln |
Umsetzung
Auf dem Server:
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);
Bei der Zertifizierungsstelle; ca ist ein hybrides Ausstellerzertifikat, dessen RSA- und ML-DSA-Schlüssel
im Prozess vorhanden sind, etwa nach einem PFX-Import:
using var caKey = RSA.Create(3072); var caRequest = new CertificateRequest( "CN=Muster GmbH 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());
Zurück auf dem Server:
using var certificate = X509Certificate2.CreateFromPem(File.ReadAllText("www.example.com.pem")); using var server = certificate.CopyWithPrivateKey(serverRsa); server.AttachAlternativePrivateMLDsaKey(serverPq);
Hinweise
- Beide Besitznachweise werden geprüft.
LoadSigningRequestmitCryptoMode.Hybridprüft die RSA-Signatur und die ML-DSA-Signatur der Anforderung. Ist eine davon ungültig, wirft die Methode eineCryptographicException. - Der ML-DSA-Schlüssel stammt aus der Anforderung. Das ausgestellte Zertifikat trägt genau den öffentlichen ML-DSA-Schlüssel des Antragstellers. Die Zertifizierungsstelle erzeugt keinen eigenen.
- Den ML-DSA-Schlüssel selbst erzeugen. Ohne das Argument
serverPqerzeugtCreateSigningRequesteinen Schlüssel, den Sie später nicht mehr erreichen. Übergeben Sie deshalb immer Ihren eigenen Schlüssel. - Den privaten ML-DSA-Schlüssel aufbewahren. Der Server braucht
serverPqwieder, wenn das Zertifikat eintrifft. Bewahren Sie den Schlüssel bis dahin auf, etwa mitExportPkcs8PrivateKeyin einer geschützten Datei, und übertragen Sie das fertige Zertifikat anschließend als PFX. - Reine ML-DSA-Anforderung. Mit
CryptoMode.PostQuantumund einer Anforderung ausMLDsaX509SignatureGenerator.CreateCertificateRequestentsteht eine Anforderung, die nur ML-DSA enthält. Wie jede Operation in der BetriebsartPostQuantumbraucht siePostQuantumExemptions.PurePostQuantum; siehe Richtlinie für Post-Quanten-Verfahren.
Verwandte Themen
de/wiki/pqcrypt/lib/how-to/request-certificates.txt · Zuletzt geändert: von Wolfgang van der Stille