So übertragen Sie Zertifikate mit PQ-Schlüssel als PFX
Sie wollen ein Zertifikat mit seinem klassischen und seinem PQ-Schlüssel in einen anderen Prozess oder auf einen anderen Rechner bringen, etwa vom Ausstellungsrechner auf den Server, der das Zertifikat verwendet.
Lösungsübersicht
| Element | Zweck |
|---|---|
ExportPfx(password) | schreibt Zertifikat, klassischen und PQ-Schlüssel in eine PKCS#12-Datei |
X509Certificate2ExportExtensions.ImportPfx(bytes, password, flags) | liest die Datei und ordnet den PQ-Schlüssel wieder zu |
X509Certificate2Collection.ExportPfx, ImportPfxCollection | dasselbe für mehrere Zertifikate, etwa mit Kette |
ExportPfx(password, pbeParameters) | wie oben, mit selbst gewählter Verschlüsselung |
Umsetzung
Exportieren; server ist ein Zertifikat mit klassischem und PQ-Schlüssel im Prozess:
using var serverRsa = RSA.Create(3072); using var server = new CertificateRequest( "CN=www.example.com", serverRsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1) .CreateSelfSigned(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(1), CryptoMode.Hybrid); string password = Convert.ToBase64String(RandomNumberGenerator.GetBytes(24)); File.WriteAllBytes("www.example.com.pfx", server.ExportPfx(password));
Importieren im anderen Prozess:
using var imported = X509Certificate2ExportExtensions.ImportPfx( File.ReadAllBytes("www.example.com.pfx"), password, X509KeyStorageFlags.EphemeralKeySet); using (var pqKey = imported.GetAlternativePrivateMLDsaKey()) { Console.WriteLine($"RSA: {imported.HasPrivateKey}, ML-DSA: {pqKey is not null}"); }
Für ein Programm, das PBES2 nicht liest, schreiben Sie die Triple-DES-Fassung ausdrücklich:
var legacy = new PbeParameters(PbeEncryptionAlgorithm.TripleDes3KeyPkcs12, HashAlgorithmName.SHA1, 2000); File.WriteAllBytes("www.example.com-3des.pfx", server.ExportPfx(password, legacy));
Hinweise
- Mit der Bibliothek importieren.
new X509Certificate2(pfx, password)von .NET liest die Datei ebenfalls und übernimmt Zertifikat und klassischen Schlüssel, übergeht aber den PQ-Schlüssel. NurImportPfxordnet ihn zu. - Kein Export ohne PQ-Schlüssel. Fordern Sie mit
ExportPfx(password, CryptoMode.Hybrid)ausdrücklich einen PQ-Export an und kennt der Prozess keinen PQ-Schlüssel, wirft die Methode eineCryptographicException, statt still eine Datei ohne PQ-Schlüssel zu schreiben. - Reine ML-DSA-Zertifikate. Für sie trägt die Datei nur den ML-DSA-Schlüssel. Nach dem Import liefert
GetPrivateMLDsaKeyden Schlüssel;HasPrivateKeybleibtfalse. - Verschlüsselung. Ohne
PbeParametersverschlüsseltExportPfxmit PQ-Schlüssel nach PBES2: AES-256-CBC, PBKDF2 mit HMAC-SHA-256 und 2048 Wiederholungen, MAC mit SHA-256. MitPbeParametersgeltenAes128Cbc,Aes192CbcoderAes256Cbcmit SHA-1, SHA-256, SHA-384 oder SHA-512, oderTripleDes3KeyPkcs12mit SHA-1. Andere Kombinationen weist die Methode mit einerCryptographicExceptionab. Unter .NET Framework stellt die BibliothekPbeParametersundPbeEncryptionAlgorithmselbst bereit, im NamensraumSystem.Security.Cryptography. CryptoMode.Classic. OhnePbeParametersschreibtExportPfxgenau die Datei, dieExport(X509ContentType.Pfx, password)von .NET schreibt, ohne PQ-Schlüssel und mit der Verschlüsselung von .NET.- Kennwort und Datei schützen. Die Datei ist nur so sicher wie ihr Kennwort. Verwenden Sie ein langes, zufälliges Kennwort, übertragen Sie es auf einem anderen Weg als die Datei und löschen Sie die Datei nach dem Import.
- .NET 8 unter Linux. Trägt das Zertifikat selbst einen ML-DSA- oder ML-KEM-Schlüssel, also kein RSA oder ECDSA, liest .NET 8 unter Linux die PFX-Datei nicht;
ImportPfxscheitert dort mit derCryptographicExceptionvon .NET. Hybride Zertifikate betrifft das nicht. Übertragen Sie solche Zertifikate unter Linux als PEM-Datei und ordnen Sie den Schlüssel mit der passenden Attach-Methode zu.
Verwandte Themen
de/wiki/pqcrypt/lib/how-to/export-and-import-pfx.txt · Last modified: by Wolfgang van der Stille