====== 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//