Color scheme: Light
You are here: start » de » Dokumentation » Post-Quanten-Kryptografie » WKL.System.Security.Cryptography – Überblick » Anleitungen » So erstellen Sie eine Zertifikatsanforderung

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

SeiteElementZweck
AntragstellerCertificateRequest.CreateSigningRequest mit CryptoMode.HybridAnforderung mit RSA- und ML-DSA-Schlüssel, beide Besitznachweise signiert
ZertifizierungsstelleX509CertificateBuilder.LoadSigningRequestliest die Anforderung und prüft beide Signaturen
ZertifizierungsstelleX509CertificateBuilder.Create mit CryptoMode.Hybridstellt das hybride Zertifikat aus
AntragstellerCopyWithPrivateKey, AttachAlternativePrivateMLDsaKeyverbindet 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. LoadSigningRequest mit CryptoMode.Hybrid prüft die RSA-Signatur und die ML-DSA-Signatur der Anforderung. Ist eine davon ungültig, wirft die Methode eine CryptographicException.
  • 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 serverPq erzeugt CreateSigningRequest einen 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 serverPq wieder, wenn das Zertifikat eintrifft. Bewahren Sie den Schlüssel bis dahin auf, etwa mit ExportPkcs8PrivateKey in einer geschützten Datei, und übertragen Sie das fertige Zertifikat anschließend als PFX.
  • Reine ML-DSA-Anforderung. Mit CryptoMode.PostQuantum und einer Anforderung aus MLDsaX509SignatureGenerator.CreateCertificateRequest entsteht eine Anforderung, die nur ML-DSA enthält. Wie jede Operation in der Betriebsart PostQuantum braucht sie PostQuantumExemptions.PurePostQuantum; siehe Richtlinie für Post-Quanten-Verfahren.

Verwandte Themen

de/wiki/pqcrypt/lib/how-to/request-certificates.txt · Last modified: by Wolfgang van der Stille