====== TrustStoreExtensions & PqTrustStore ====== Gestione Trust Store personalizzato per infrastrutture PKI compatibili con PQ. ---- ===== Panoramica ===== ^ Classe ^ Descrizione ^ | ''PqTrustStore'' | Trust Store completo con supporto PQ | | ''TrustStoreExtensions'' | Metodi di estensione per ''X509Certificate2Collection'' | | ''TrustEntry'' | Metadati per voci del Trust Store | | ''TrustType'' | Enum: TrustAnchor, IntermediateCA, ecc. | ---- ===== Classe PqTrustStore ===== using WvdS.System.Security.Cryptography.X509Certificates; // Creare il Trust Store using var trustStore = new PqTrustStore(); // Aggiungere la Root CA var rootCa = new X509Certificate2("root-ca.cer"); trustStore.AddTrustAnchor(rootCa, alias: "Company Root CA"); // Aggiungere la CA intermedia var intermediateCa = new X509Certificate2("intermediate-ca.cer"); trustStore.AddIntermediate(intermediateCa, alias: "Issuing CA"); // Utilizzare il Trust Store Console.WriteLine($"Il Trust Store contiene {trustStore.Count} voci"); ---- ===== Integrazione con X509Chain ===== **Validazione con Trust Store personalizzato:** using System.Security.Cryptography.X509Certificates; using WvdS.System.Security.Cryptography; using WvdS.System.Security.Cryptography.X509Certificates; // Caricare il Trust Store using var trustStore = PqTrustStore.LoadFromPem("company-trust-store.pem"); // Validare il certificato var userCert = new X509Certificate2("user.cer"); using var chain = new X509Chain(); bool isValid = chain.Build(userCert, trustStore, CryptoMode.Hybrid); if (isValid) { Console.WriteLine("Il certificato è valido"); } else { foreach (var status in chain.ChainStatus) { Console.WriteLine($"Errore: {status.StatusInformation}"); } } **Con X509Certificate2Collection:** // Più semplice: direttamente con Collection var trustAnchors = TrustStoreExtensions.LoadFromPem("trust-anchors.pem"); using var chain = new X509Chain(); bool isValid = chain.Build(userCert, trustAnchors, CryptoMode.Hybrid); ---- ===== Import/Export Trust Store ===== **Bundle PEM:** // Salvare trustStore.SaveToPem("trust-store.pem"); // Caricare var loadedStore = PqTrustStore.LoadFromPem("trust-store.pem"); **PKCS#7 (DER):** // Salvare come PKCS#7 trustStore.SaveToPkcs7("trust-store.p7b"); // Caricare var loadedStore = PqTrustStore.LoadFromPkcs7("trust-store.p7b"); ---- ===== Import da System Store ===== // Popolare il Trust Store con certificati di sistema using var trustStore = new PqTrustStore(); // Importare le Root CA di Windows trustStore.ImportFromSystemRootStore(); // Importare le CA intermedie di Windows trustStore.ImportFromSystemIntermediateStore(); // Esportare come PEM per sistemi air-gapped trustStore.SaveToPem("system-trust-store.pem"); ---- ===== Enum TrustType ===== ^ Valore ^ Descrizione ^ | ''TrustAnchor'' | Ancora di fiducia (Root CA) | | ''IntermediateCA'' | Autorità di certificazione intermedia | | ''CrossCertifiedCA'' | CA con certificazione incrociata | | ''EndEntity'' | Entità finale (non CA) | ---- ===== Query Trust Store ===== // Solo Trust Anchor var roots = trustStore.TrustAnchors; // Solo CA intermedie var intermediates = trustStore.IntermediateCAs; // Ricerca per Subject var found = trustStore.FindBySubjectName("Company"); // Ricerca per Thumbprint var entry = trustStore.FindByThumbprint("A1B2C3..."); // Verificare se contenuto bool exists = trustStore.Contains(certificate); ---- ===== Report di validazione ===== using var chain = new X509Chain(); chain.Build(cert, trustStore, CryptoMode.Hybrid); // Creare un report dettagliato var report = chain.GetValidationReport(); Console.WriteLine($"Valido: {report.IsValid}"); Console.WriteLine($"Lunghezza catena: {report.ChainLength}"); Console.WriteLine($"Completamente protetto PQ: {report.IsFullyPqProtected}"); // Singoli elementi foreach (var element in report.Elements) { Console.WriteLine($" {element.Subject}"); Console.WriteLine($" Modalità: {element.CryptoMode}"); Console.WriteLine($" Chiavi PQ: {element.HasPqKeys}"); } **Output di esempio:** Chain Validation: VALID Chain Length: 3 Fully PQ Protected: True Elements: [0] CN=User Certificate Mode: Hybrid, PQ Keys: True [1] CN=Issuing CA Mode: Hybrid, PQ Keys: True [2] CN=Root CA Mode: Hybrid, PQ Keys: True ---- ===== Verifica CRL offline ===== Per sistemi air-gapped con CRL precaricate: // Caricare le CRL var crls = new List { File.ReadAllBytes("root-ca.crl"), File.ReadAllBytes("issuing-ca.crl") }; using var chain = new X509Chain(); bool isValid = chain.BuildWithOfflineCrl( certificate, trustStore.ToCollection(), crls, CryptoMode.Hybrid); ---- ===== Estensioni Collection ===== // Filtrare la collection var collection = new X509Certificate2Collection(); collection.Import("certificates.p7b"); // Solo CA var cas = collection.FilterCertificateAuthorities(); // Solo Root CA (autofirmate) var roots = collection.FilterRootCertificates(); // Ricerca per Subject var found = collection.FindBySubjectName("Company"); // Verificare lo stato PQ bool hasPq = collection.HasPqProtectedCertificates(); // Salvare come PEM collection.SaveToPem("output.pem"); ---- ===== Best Practice ===== **Gerarchia Trust Store:** PqTrustStore ├── TrustAnchors (Root CA) │ └── → chain.ChainPolicy.CustomTrustStore └── IntermediateCAs └── → chain.ChainPolicy.ExtraStore **Raccomandazioni:** * **Principio del minimo:** Includere solo le CA necessarie * **Migrazione PQ:** Aggiungere gradualmente chiavi PQ alle CA esistenti * **Backup:** Eseguire backup regolari del Trust Store * **Validazione:** Verificare le nuove CA prima dell'inclusione ---- ===== Vedere anche ===== * [[.:x509chainextensions|X509ChainExtensions]] - Validazione della catena * [[.:revocationextensions|RevocationExtensions]] - Verifica di revoca * [[it:int:pqcrypt:konzepte:pki|Concetti PKI]] ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional// {{tag>truststore pki ca chain}}