Inhaltsverzeichnis

X509StoreExtensions

Namespace: WvdS.System.Security.Cryptography.X509Certificates

Extensions für X509Store mit Post-Quantum Key-Persistenz. Ermöglicht das Speichern und Wiederherstellen von PQ-Schlüsseln im Windows Certificate Store.

Übersicht

Der Windows Certificate Store unterstützt keine Post-Quantum Schlüssel nativ. Diese Extensions speichern PQ-Keys in einem separaten, verschlüsselten Dateispeicher:

%LOCALAPPDATA%\WvdS.Crypto\PqKeys\{thumbprint}.pqkey

Die Keys werden automatisch mit DPAPI (Windows) oder AES-256 (Cross-Platform) verschlüsselt.

Methoden

Methode Beschreibung
Add(certificate, mode) Fügt Zertifikat hinzu und persistiert PQ-Keys
AddRange(collection, mode) Fügt mehrere Zertifikate hinzu
Remove(certificate, deletePqKeys) Entfernt Zertifikat und optional PQ-Keys
RemoveRange(collection, deletePqKeys) Entfernt mehrere Zertifikate
Find(findType, findValue, validOnly, restorePqKeys) Sucht Zertifikate und stellt PQ-Keys wieder her
GetCertificatesWithPqKeys() Alle Zertifikate mit wiederhergestellten PQ-Keys

Statische Methoden

Methode Beschreibung
PersistPqKeys(certificate) Persistiert PQ-Keys manuell
RestorePqKeys(certificate) Stellt PQ-Keys manuell wieder her
DeletePqKeys(certificate) Löscht persistierte PQ-Keys
HasPersistedPqKeys(certificate) Prüft ob PQ-Keys vorhanden
GetPersistedPqKeyThumbprints() Listet alle Thumbprints

Zertifikat hinzufügen

using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
 
// Zertifikat mit PQ-Keys hinzufügen
var hybridCert = CreateHybridCertificate();
store.Add(hybridCert, CryptoMode.Hybrid);
 
// PQ-Keys werden automatisch persistiert
Console.WriteLine($"PQ-Keys gespeichert: {X509StoreExtensions.HasPersistedPqKeys(hybridCert)}");

Zertifikat suchen mit PQ-Keys

using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
 
// Suchen und PQ-Keys wiederherstellen
var certs = store.Find(
    X509FindType.FindBySubjectName,
    "MeinZertifikat",
    validOnly: true,
    restorePqKeys: true);  // PQ-Keys automatisch laden
 
foreach (var cert in certs)
{
    Console.WriteLine($"Gefunden: {cert.Subject}");
    Console.WriteLine($"Modus: {cert.GetCryptoMode()}");
 
    // PQ-Keys sind jetzt verfügbar
    if (PqKeyStore.TryGetPublicKey(cert, out var pqKey))
    {
        Console.WriteLine($"PQ-Key: {pqKey.Length} Bytes");
    }
}

Alle Zertifikate mit PQ-Keys

using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
 
var allCerts = store.GetCertificatesWithPqKeys();
 
foreach (var cert in allCerts)
{
    var hasPq = X509StoreExtensions.HasPersistedPqKeys(cert);
    Console.WriteLine($"{cert.Subject}: PQ={hasPq}");
}

Zertifikat entfernen

using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
 
var certToRemove = FindCertificate(store);
 
// Mit PQ-Key Cleanup (empfohlen)
store.Remove(certToRemove, deletePqKeys: true);
 
// Ohne PQ-Key Cleanup (Keys bleiben erhalten)
store.Remove(certToRemove, deletePqKeys: false);

PqKeyStoreManager

Zusätzliche Klasse für Store-Management:

// Verwaiste Keys aufräumen (Keys ohne zugehöriges Zertifikat)
int deleted = PqKeyStoreManager.CleanupOrphanedKeys(
    StoreName.My,
    StoreLocation.CurrentUser);
Console.WriteLine($"{deleted} verwaiste Keys gelöscht");
 
// Backup aller PQ-Keys
PqKeyStoreManager.BackupAllPqKeys(
    "pq-keys-backup.enc",
    "BackupPasswort123!");
 
// Restore aus Backup
int restored = PqKeyStoreManager.RestoreFromBackup(
    "pq-keys-backup.enc",
    "BackupPasswort123!");
Console.WriteLine($"{restored} Keys wiederhergestellt");

Key-Verschlüsselung

Windows (DPAPI)

DataProtectionScope.CurrentUser
- Nur der aktuelle Benutzer kann Keys entschlüsseln
- Keys sind an das Benutzerprofil gebunden

Cross-Platform (AES-256)

Key = SHA256(MachineName + UserName)
IV = zufällig generiert
- Keys sind an Machine + User gebunden
- Weniger sicher als DPAPI

Sicheres Löschen

PQ-Keys werden sicher gelöscht:

// Intern wird ausgeführt:
// 1. Datei mit Zufallsdaten überschreiben
var random = RandomNumberGenerator.GetBytes(fileLength);
File.WriteAllBytes(keyPath, random);
 
// 2. Datei löschen
File.Delete(keyPath);

Beispiel: Vollständiger Workflow

// 1. Hybrid-Zertifikat erstellen
CryptoConfig.EnablePostQuantum();
var cert = CreateHybridCertificate("CN=Hybrid Test");
 
// 2. Zum Store hinzufügen
using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
    store.Open(OpenFlags.ReadWrite);
    store.Add(cert, CryptoMode.Hybrid);
}
 
// 3. Anwendung neu starten...
 
// 4. Später wieder laden
using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
    store.Open(OpenFlags.ReadOnly);
    var found = store.Find(
        X509FindType.FindBySubjectName,
        "Hybrid Test",
        true,
        restorePqKeys: true);
 
    var loadedCert = found[0];
 
    // PQ-Keys sind wiederhergestellt!
    var pqPublicKey = PqKeyStore.GetPublicKey(loadedCert);
    Console.WriteLine($"PQ-Key geladen: {pqPublicKey.Length} Bytes");
}

Speicherort

Betriebssystem Pfad
Windows %LOCALAPPDATA%\WvdS.Crypto\PqKeys\
Linux ~/.local/share/WvdS.Crypto/PqKeys/
macOS ~/Library/Application Support/WvdS.Crypto/PqKeys/

Sicherheitshinweise

  • PQ-Keys sind nur für den aktuellen Benutzer zugänglich
  • Backup vor System-Migration erstellen
  • CleanupOrphanedKeys() regelmäßig ausführen
  • Cross-Platform-Verschlüsselung ist weniger sicher als DPAPI

Siehe auch


Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional