Der private ML-DSA-Schlüssel fehlt
Ein Aufruf mit CryptoMode.Hybrid oder CryptoMode.PostQuantum wirft eine CryptographicException mit einer
dieser Meldungen:
The ML-DSA private key of issuer 'CN=Muster GmbH Hybrid CA' is not available. No ML-DSA private key is available for signer 'CN=Muster GmbH Buchhaltung'; Hybrid signing requires one. A PQ export was requested, but no ML-DSA private key is available for any certificate. No ML-DSA key pair is available for 'CN=www.example.com'; a PQ store operation needs one.
Oder GetAlternativePrivateMLDsaKey beziehungsweise GetPrivateMLDsaKey gibt null zurück.
Umgebung
Alle Zielsysteme. Betroffen sind Operationen, die mit dem privaten ML-DSA-Schlüssel eines Zertifikats signieren: Zertifikate und Sperrlisten ausstellen, CMS-Nachrichten signieren, PFX-Dateien mit PQ-Schlüssel exportieren und Schlüsseldateien ablegen.
Ursache
X509Certificate2 von .NET trägt keinen ML-DSA-Schlüssel. Die Bibliothek hält ihn in einer Tabelle des Prozesses,
die das Zertifikat über seinen Fingerabdruck findet. Der Eintrag fehlt in diesen Fällen:
- Das Zertifikat wurde in einem anderen Prozess ausgestellt und als PEM- oder DER-Datei geladen. Solche Dateien enthalten keinen privaten Schlüssel.
- Das Zertifikat wurde mit
new X509Certificate2(pfx, password)von .NET importiert. Dieser Weg übergeht den PQ-Schlüssel der PFX-Datei. - Ein reines ML-DSA-Zertifikat wurde mit
Createaus einer Anforderung ausgestellt. Es kennt zunächst nur den öffentlichen Schlüssel. - Der Prozess wurde neu gestartet. Die Tabelle lebt nur so lange wie der Prozess.
Lösung
Ordnen Sie den Schlüssel zu, bevor Sie die Operation aufrufen. Der Weg hängt davon ab, wo der Schlüssel liegt:
| Der Schlüssel liegt | Zuordnen mit |
|---|---|
in einer PFX-Datei aus ExportPfx | X509Certificate2ExportExtensions.ImportPfx statt des Konstruktors von .NET |
| in einer Schlüsseldatei neben dem Zertifikatsspeicher | X509Store.Find(findType, findValue, validOnly, restorePqKeys: true) oder X509StoreExtensions.RestorePqKeys |
als MLDsaKey im Prozess, hybrides Zertifikat | certificate.AttachAlternativePrivateMLDsaKey(key) |
als MLDsaKey im Prozess, reines ML-DSA-Zertifikat | certificate.AttachPrivateMLDsaKey(key) |
Prüfen Sie danach mit GetAlternativePrivateMLDsaKey beziehungsweise GetPrivateMLDsaKey, dass der Schlüssel
vorhanden ist. HasPrivateKey von .NET zeigt nur den klassischen Schlüssel an. Einzelheiten:
Schlüssel und ihre Ablage.