Color scheme: Light
You are here: start » de » Dokumentation » Post-Quanten-Kryptografie » WKL.System.Security.Cryptography – Überblick » Konzepte » Schlüssel und ihre Ablage

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" --> STORE

Bild: 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 ExportPfx und ImportPfx, 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üsselLesenZuordnen
ML-DSA-Schlüssel eines hybriden ZertifikatsGetAlternativePrivateMLDsaKeyAttachAlternativePrivateMLDsaKey
ML-DSA-Schlüssel eines reinen ML-DSA-ZertifikatsGetPrivateMLDsaKeyAttachPrivateMLDsaKey
ML-KEM-SchlüsselGetPrivateMLKemKeyAttachPrivateMLKemKey
Composite-ML-KEM-SchlüsselGetPrivateCompositeMLKemKeyAttachPrivateCompositeMLKemKey

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:

BetriebssystemSchutz
WindowsWindows-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 Servicekeine 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 ExportPfx mit PbeEncryptionAlgorithm.TripleDes3KeyPkcs12 die 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, die ARGON2ID nennt.

Verwandte Themen

de/wiki/pqcrypt/lib/concepts/keys-and-key-storage.txt · Last modified: by Wolfgang van der Stille