====== 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 =====
* [[.:x509certificate2exportextensions|X509Certificate2ExportExtensions]]
* [[.:x509certificate2extensions|X509Certificate2Extensions]]
* [[.:truststoreextensions|TrustStoreExtensions]]
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//