====== X509StoreExtensions ====== **Namespace:** ''WvdS.System.Security.Cryptography.X509Certificates'' Estensioni per ''X509Store'' con persistenza delle chiavi Post-Quantum. Consente di salvare e ripristinare le chiavi PQ nel Windows Certificate Store. ===== Panoramica ===== Il Windows Certificate Store non supporta nativamente le chiavi Post-Quantum. Queste estensioni salvano le chiavi PQ in un archivio file separato e crittografato: %LOCALAPPDATA%\WvdS.Crypto\PqKeys\{thumbprint}.pqkey Le chiavi vengono crittografate automaticamente con DPAPI (Windows) o AES-256 (Cross-Platform). ===== Metodi ===== ^ Metodo ^ Descrizione ^ | ''Add(certificate, mode)'' | Aggiunge il certificato e persiste le chiavi PQ | | ''AddRange(collection, mode)'' | Aggiunge più certificati | | ''Remove(certificate, deletePqKeys)'' | Rimuove il certificato e opzionalmente le chiavi PQ | | ''RemoveRange(collection, deletePqKeys)'' | Rimuove più certificati | | ''Find(findType, findValue, validOnly, restorePqKeys)'' | Cerca certificati e ripristina le chiavi PQ | | ''GetCertificatesWithPqKeys()'' | Tutti i certificati con chiavi PQ ripristinate | ===== Metodi statici ===== ^ Metodo ^ Descrizione ^ | ''PersistPqKeys(certificate)'' | Persiste manualmente le chiavi PQ | | ''RestorePqKeys(certificate)'' | Ripristina manualmente le chiavi PQ | | ''DeletePqKeys(certificate)'' | Elimina le chiavi PQ persistite | | ''HasPersistedPqKeys(certificate)'' | Verifica se le chiavi PQ sono presenti | | ''GetPersistedPqKeyThumbprints()'' | Elenca tutti i thumbprint | ===== Aggiungere un certificato ===== using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite); // Aggiungere certificato con chiavi PQ var hybridCert = CreateHybridCertificate(); store.Add(hybridCert, CryptoMode.Hybrid); // Le chiavi PQ vengono persistite automaticamente Console.WriteLine($"Chiavi PQ salvate: {X509StoreExtensions.HasPersistedPqKeys(hybridCert)}"); ===== Cercare certificato con chiavi PQ ===== using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); // Cercare e ripristinare le chiavi PQ var certs = store.Find( X509FindType.FindBySubjectName, "MioCertificato", validOnly: true, restorePqKeys: true); // Carica automaticamente le chiavi PQ foreach (var cert in certs) { Console.WriteLine($"Trovato: {cert.Subject}"); Console.WriteLine($"Modalità: {cert.GetCryptoMode()}"); // Le chiavi PQ sono ora disponibili if (PqKeyStore.TryGetPublicKey(cert, out var pqKey)) { Console.WriteLine($"Chiave PQ: {pqKey.Length} Bytes"); } } ===== Tutti i certificati con chiavi PQ ===== 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}"); } ===== Rimuovere un certificato ===== using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite); var certToRemove = FindCertificate(store); // Con pulizia chiavi PQ (consigliato) store.Remove(certToRemove, deletePqKeys: true); // Senza pulizia chiavi PQ (le chiavi rimangono) store.Remove(certToRemove, deletePqKeys: false); ===== PqKeyStoreManager ===== Classe aggiuntiva per la gestione dello store: // Pulizia chiavi orfane (chiavi senza certificato associato) int deleted = PqKeyStoreManager.CleanupOrphanedKeys( StoreName.My, StoreLocation.CurrentUser); Console.WriteLine($"{deleted} chiavi orfane eliminate"); // Backup di tutte le chiavi PQ PqKeyStoreManager.BackupAllPqKeys( "pq-keys-backup.enc", "PasswordBackup123!"); // Ripristino da backup int restored = PqKeyStoreManager.RestoreFromBackup( "pq-keys-backup.enc", "PasswordBackup123!"); Console.WriteLine($"{restored} chiavi ripristinate"); ===== Crittografia delle chiavi ===== ==== Windows (DPAPI) ==== DataProtectionScope.CurrentUser - Solo l'utente corrente può decrittografare le chiavi - Le chiavi sono legate al profilo utente ==== Cross-Platform (AES-256) ==== Key = SHA256(MachineName + UserName) IV = generato casualmente - Le chiavi sono legate a Machine + User - Meno sicuro di DPAPI ===== Eliminazione sicura ===== Le chiavi PQ vengono eliminate in modo sicuro: // Internamente viene eseguito: // 1. Sovrascrivere il file con dati casuali var random = RandomNumberGenerator.GetBytes(fileLength); File.WriteAllBytes(keyPath, random); // 2. Eliminare il file File.Delete(keyPath); ===== Esempio: Workflow completo ===== // 1. Creare un certificato ibrido CryptoConfig.EnablePostQuantum(); var cert = CreateHybridCertificate("CN=Test Ibrido"); // 2. Aggiungere allo store using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) { store.Open(OpenFlags.ReadWrite); store.Add(cert, CryptoMode.Hybrid); } // 3. Riavviare l'applicazione... // 4. Caricare successivamente using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) { store.Open(OpenFlags.ReadOnly); var found = store.Find( X509FindType.FindBySubjectName, "Test Ibrido", true, restorePqKeys: true); var loadedCert = found[0]; // Le chiavi PQ sono ripristinate! var pqPublicKey = PqKeyStore.GetPublicKey(loadedCert); Console.WriteLine($"Chiave PQ caricata: {pqPublicKey.Length} Bytes"); } ===== Percorso di archiviazione ===== ^ Sistema operativo ^ Percorso ^ | Windows | ''%LOCALAPPDATA%\WvdS.Crypto\PqKeys\'' | | Linux | ''~/.local/share/WvdS.Crypto/PqKeys/'' | | macOS | ''~/Library/Application Support/WvdS.Crypto/PqKeys/'' | ===== Note sulla sicurezza ===== * Le chiavi PQ sono accessibili solo all'utente corrente * Creare backup prima della migrazione del sistema * Eseguire regolarmente ''CleanupOrphanedKeys()'' * La crittografia cross-platform è meno sicura di DPAPI ===== Vedere anche ===== * [[.:x509certificate2exportextensions|X509Certificate2ExportExtensions]] * [[.:x509certificate2extensions|X509Certificate2Extensions]] * [[.:truststoreextensions|TrustStoreExtensions]] ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//