Schlüssel und ihre Ablage
graph TD
NEW["Zertifikat neu ausgestellt"]
PEM["Zertifikat aus PEM oder DER geladen"]
PFX["PFX-Datei, PBES2 mit AES-256"]
STORE["Schlüsseldatei neben dem Zertifikatsspeicher"]
OS["Schlüsselspeicher des Betriebssystems: DPAPI oder Secret Service"]
BAK["Sicherungsdatei, Argon2id und AES-256-GCM"]
TABLE["Schlüsseltabelle des Prozesses, nach Fingerabdruck"]
NEW -- "automatisch" --> TABLE
PEM -- "Attach-Methode" --> TABLE
PFX -- "ImportPfx" --> TABLE
TABLE -- "ExportPfx" --> PFX
TABLE -- "X509Store.Add mit CryptoMode" --> STORE
STORE -- "X509Store.Find mit restorePqKeys" --> TABLE
OS -. "schützt" .-> STORE
STORE -- "BackupAllPqKeys" --> BAK
BAK -- "RestoreFromBackup" --> STOREBild: Private PQ-Schlüssel liegen während der Laufzeit in einer Tabelle des Prozesses. Dauerhaft liegen sie in einer PFX-Datei oder in einer Schlüsseldatei neben dem Zertifikatsspeicher, die der Schlüsselspeicher des Betriebssystems schützt. Eine Sicherung fasst alle Schlüsseldateien unter einem Kennwort zusammen.
X509Certificate2 von .NET kennt keine ML-DSA- und keine ML-KEM-Schlüssel und kann sie deshalb nicht
tragen. Die Bibliothek hält die privaten PQ-Schlüssel darum außerhalb des Zertifikats und ordnet sie ihm
über seinen Fingerabdruck zu.
Wichtige Funktionen
- Automatische Zuordnung beim Ausstellen: Ein neu ausgestelltes Zertifikat findet seinen privaten PQ-Schlüssel ohne weiteren Aufruf.
- Nachträgliche Zuordnung mit den Attach-Methoden für Zertifikate, die aus Dateien ohne Schlüssel geladen wurden.
- Transport als PFX-Datei mit
ExportPfxundImportPfx, verschlüsselt mit PBES2 und AES-256. - Ablage neben dem Zertifikatsspeicher mit den Erweiterungen von
X509Store, geschützt durch den Schlüsselspeicher des Betriebssystems unter Windows und Linux. - Sicherung aller abgelegten Schlüssel in eine kennwortgeschützte Datei mit
PqKeyStoreManager, die sich auf einem anderen Rechner und in einem anderen Konto zurückspielen lässt.
Grundkonzepte
Die Schlüsseltabelle des Prozesses
Stellt die Bibliothek ein Zertifikat mit PQ-Anteil aus, legt sie den privaten PQ-Schlüssel in einer Tabelle
ab, die für den ganzen Prozess gilt. Schlüssel der Tabelle ist der Fingerabdruck des Zertifikats. Jedes
Objekt X509Certificate2 mit demselben Inhalt findet deshalb denselben Schlüssel, auch eine neu geladene
Kopie. Die Einträge bleiben bis zum Ende des Prozesses bestehen.
Ein Zertifikat, das ein anderer Prozess ausgestellt hat und das als PEM- oder DER-Datei vorliegt, hat in der Tabelle keinen Schlüssel. Ordnen Sie ihn mit der Methode zu, die zur Art des Schlüssels passt:
| Schlüssel | Lesen | Zuordnen |
|---|---|---|
| ML-DSA-Schlüssel eines hybriden Zertifikats | GetAlternativePrivateMLDsaKey | AttachAlternativePrivateMLDsaKey |
| ML-DSA-Schlüssel eines reinen ML-DSA-Zertifikats | GetPrivateMLDsaKey | AttachPrivateMLDsaKey |
| ML-KEM-Schlüssel | GetPrivateMLKemKey | AttachPrivateMLKemKey |
| Composite-ML-KEM-Schlüssel | GetPrivateCompositeMLKemKey | AttachPrivateCompositeMLKemKey |
Die Lesemethoden geben null zurück, wenn der Prozess keinen Schlüssel kennt. Die Eigenschaft
HasPrivateKey von .NET bezieht sich nur auf klassische Schlüssel; für ein reines ML-DSA-Zertifikat bleibt
sie auch nach der Zuordnung false.
CopyWithPrivateKey(privateKey, mode) fügt wie die Methode von .NET nur den klassischen Schlüssel an. Die
Kopie hat denselben Fingerabdruck und findet deshalb einen schon zugeordneten PQ-Schlüssel. Einen
PQ-Schlüssel erzeugt die Methode nicht; mit CryptoMode.Hybrid prüft sie nur, dass das Zertifikat einen
alternativen ML-DSA-Schlüssel trägt.
PFX-Dateien
ExportPfx schreibt das Zertifikat, den klassischen und den PQ-Schlüssel in eine kennwortgeschützte Datei.
X509Certificate2ExportExtensions.ImportPfx liest sie und ordnet den PQ-Schlüssel wieder zu. Das ist der
Weg, um Schlüssel zwischen Prozessen und Rechnern zu übertragen.
Mit PQ-Schlüssel verschlüsselt ExportPfx alle Teile der Datei nach PBES2 (RFC 8018): AES-256-CBC mit
einem Schlüssel aus PBKDF2 mit HMAC-SHA-256 und 2048 Wiederholungen; die Prüfsumme der Datei (MAC) bildet
SHA-256. Das entspricht der Voreinstellung von OpenSSL 3.6. Eine Überladung mit PbeParameters wählt
Verfahren und Wiederholungszahl selbst. Einzelheiten:
So übertragen Sie Zertifikate mit PQ-Schlüssel als PFX.
Ablage neben dem Zertifikatsspeicher
Der Zertifikatsspeicher des Betriebssystems nimmt keine PQ-Schlüssel auf. X509Store.Add(certificate, mode)
legt das Zertifikat deshalb wie gewohnt im Speicher ab und schreibt den PQ-Schlüssel zusätzlich in eine
Datei <Fingerabdruck>.pqkey im Verzeichnis WKL.Crypto/PqKeys unter dem lokalen
Anwendungsdatenverzeichnis des Kontos (%LOCALAPPDATA% unter Windows, ~/.local/share unter Linux).
X509Store.Find(findType, findValue, validOnly, restorePqKeys: true) liest die Datei beim Suchen und ordnet
den Schlüssel wieder zu.
Den Inhalt der Datei schützt der Schlüsselspeicher des Betriebssystems für das angemeldete Konto:
| Betriebssystem | Schutz |
|---|---|
| Windows | Windows-Datenschutz-API (DPAPI) für das angemeldete Konto |
| Linux mit Secret Service (etwa GNOME Keyring oder KWallet) | AES-256-GCM mit einem zufälligen Umhüllungsschlüssel, den der Secret Service des Kontos verwahrt; die Datei ist an den Fingerabdruck ihres Zertifikats gebunden |
| macOS, Linux ohne Secret Service | keine Ablage: X509Store.Add mit PQ-Betriebsart und PersistPqKeys werfen PlatformNotSupportedException, der Zertifikatsspeicher bleibt unverändert |
Auf Systemen ohne Schlüsselspeicher bewahren Sie die Schlüssel als PFX-Datei auf.
Schlüsseldateien, die eine frühere Fassung der Bibliothek außerhalb von Windows geschrieben hat, liest
RestorePqKeys weiterhin. Steht ein Schlüsselspeicher bereit, schreibt die Methode die Datei dabei sofort im
neuen Format neu.
Sicherung
PqKeyStoreManager.BackupAllPqKeys(backupPath, password) entschlüsselt alle Schlüsseldateien des Kontos und
schreibt die Schlüssel in eine Sicherungsdatei:
- Den Schlüssel leitet Argon2id (RFC 9106) aus dem Kennwort ab, mit 3 Durchläufen, 64 MiB Speicher und einer Parallelität von 4.
- Den Inhalt verschlüsselt und schützt AES-256-GCM; eine veränderte Datei wird beim Zurückspielen abgewiesen.
RestoreFromBackup(backupPath, password) legt die Schlüsseldateien unter dem Schutz des Kontos an, in dem
es läuft. Die Sicherung lässt sich deshalb auf einem anderen Rechner und in einem anderen Konto
zurückspielen. Sicherungen einer früheren Fassung der Bibliothek liest die Methode weiterhin; sie stellen
nur im ursprünglichen Konto auf dem ursprünglichen Rechner wieder her.
CleanupOrphanedKeys löscht Schlüsseldateien, zu denen der Zertifikatsspeicher kein Zertifikat mehr enthält.
Grenzen
- Schutz gegen andere Konten, nicht gegen das eigene. DPAPI und der Secret Service geben den Schlüssel jedem Programm heraus, das im selben Konto läuft. Wer Code im Konto ausführen kann, kann die Schlüsseldateien lesen.
- Ablage nur unter Windows und Linux mit Secret Service. Auf anderen Systemen und in Linux-Sitzungen ohne Secret Service, etwa in Diensten und Containern ohne Anmeldesitzung, legt die Bibliothek keine Schlüsseldatei an.
- Das Kennwort schützt PFX-Datei und Sicherung allein. Wer die Datei und das Kennwort hat, hat die Schlüssel. Verwenden Sie ein langes, zufälliges Kennwort und übertragen Sie es auf einem anderen Weg als die Datei.
- Ältere Importprogramme. Programme, die PBES2 nicht lesen, etwa ältere Windows-Fassungen, importieren die PFX-Datei nicht. Für sie schreibt
ExportPfxmitPbeEncryptionAlgorithm.TripleDes3KeyPkcs12die schwächere Triple-DES-Fassung. - Schlüssel im Arbeitsspeicher. Private PQ-Schlüssel liegen bis zum Ende des Prozesses unverschlüsselt im Arbeitsspeicher des Prozesses.
- Argon2id braucht OpenSSL ab 3.2. Sicherung und Wiederherstellung rechnen Argon2id in OpenSSL; jede Fassung mit ML-DSA, also ab 3.5, erfüllt das. Bietet die geladene Installation Argon2id nicht an, wirft die Sicherung eine
CryptographicException, dieARGON2IDnennt.