So stellen Sie reine ML-DSA-Zertifikate aus
Sie brauchen eine Zertifizierungsstelle und Zertifikate, die ausschließlich ML-DSA verwenden, etwa für eine geschlossene Umgebung, in der alle Beteiligten ML-DSA prüfen.
Lösungsübersicht
| Element | Zweck |
|---|---|
PostQuantumConfig.Exemptions | erlaubt mit PurePostQuantum die Betriebsart PostQuantum |
MLDsaKey.Generate | erzeugt ein ML-DSA-Schlüsselpaar mit dem Parametersatz ML-DSA-65 oder ML-DSA-87; ML-DSA-44 nur mit ReducedParameterSets |
MLDsaX509SignatureGenerator.CreateCertificateRequest | erzeugt eine CertificateRequest für einen ML-DSA-Schlüssel |
CreateSelfSigned, Create mit CryptoMode.PostQuantum | stellen das Zertifikat nach RFC 9881 aus |
X509Chain.Build mit CryptoMode.PostQuantum | prüft die Kette |
AttachPrivateMLDsaKey | ordnet einem ausgestellten Zertifikat seinen privaten Schlüssel zu |
X509CertificateBuilder | derselbe Weg für .NET Framework 4.6.2, das CertificateRequest nicht kennt |
Umsetzung
BSI TR-02102-1 empfiehlt PQ-Signaturen nur in Kombination mit einer klassischen Signatur. Die Betriebsart
PostQuantum braucht deshalb eine Freischaltung, die Sie einmal beim Start der Anwendung setzen:
PostQuantumConfig.Exemptions |= PostQuantumExemptions.PurePostQuantum;
Stammzertifikat:
var now = DateTimeOffset.UtcNow; using var rootKey = MLDsaKey.Generate(MLDsaParameterSet.MLDsa65); var rootRequest = new MLDsaX509SignatureGenerator(rootKey) .CreateCertificateRequest("CN=Muster GmbH PQ Root CA"); rootRequest.CertificateExtensions.Add(new X509BasicConstraintsExtension(true, false, 0, true)); rootRequest.CertificateExtensions.Add( new X509KeyUsageExtension(X509KeyUsageFlags.KeyCertSign | X509KeyUsageFlags.CrlSign, true)); using var root = rootRequest.CreateSelfSigned(now, now.AddYears(10), CryptoMode.PostQuantum);
Zertifikat eines Unterzeichners, ausgestellt vom Stammzertifikat, mit Prüfung der Kette:
using var signerKey = MLDsaKey.Generate(MLDsaParameterSet.MLDsa65); var signerRequest = new MLDsaX509SignatureGenerator(signerKey) .CreateCertificateRequest("CN=signer.example.com"); signerRequest.CertificateExtensions.Add( new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, true)); using var signer = signerRequest.Create( root, now, now.AddYears(1), RandomNumberGenerator.GetBytes(16), CryptoMode.PostQuantum); signer.AttachPrivateMLDsaKey(signerKey); using var chain = new X509Chain(); chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust; chain.ChainPolicy.CustomTrustStore.Add(root); chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; Console.WriteLine(chain.Build(signer, CryptoMode.PostQuantum));
Für .NET Framework 4.6.2 stellen Sie das Zertifikat mit X509CertificateBuilder aus:
var builder = new X509CertificateBuilder( new X500DistinguishedName("CN=signer.example.com"), signerKey); using var selfSigned = builder.CreateSelfSigned(now, now.AddYears(1), CryptoMode.PostQuantum);
Hinweise
- Den privaten Schlüssel zuordnen. Ein mit
Createausgestelltes Zertifikat kennt nur den öffentlichen Schlüssel aus der Anforderung.GetPrivateMLDsaKeygibt dafürnullzurück, bis SieAttachPrivateMLDsaKeyaufrufen. Erst dann kann das Zertifikat signieren, ausstellen oder als PFX exportiert werden. HasPrivateKeybleibtfalse. Die Eigenschaft von .NET kennt nur klassische Schlüssel. Ob ein ML-DSA-Schlüssel vorhanden ist, zeigtGetPrivateMLDsaKey.- Ohne
CryptoModegilt .NET.rootRequest.CreateSelfSigned(notBefore, notAfter)ohne Argument bindet an die Methode von .NET. Sie kennt den ML-DSA-Schlüssel nicht und wirft eineInvalidOperationException. - Freischaltung auch beim Prüfen. Ohne
PurePostQuantumwirft jede Operation in der BetriebsartPostQuantumeineCryptographicException, auchX509Chain.Build. Jede Operation meldet das EreignisPolicyDeviation; siehe Richtlinie für Post-Quanten-Verfahren. - Nur Prüfer mit ML-DSA. Software ohne ML-DSA-Kenntnis kann diese Zertifikate nicht prüfen. Für den Übergang verwenden Sie hybride Zertifikate wie in Die erste hybride Zertifikatskette.
Verwandte Themen
de/wiki/pqcrypt/lib/how-to/issue-ml-dsa-certificates.txt · Last modified: by Wolfgang van der Stille