~~NOTOC~~ ====== Scenario 5.1: Chain Building ====== **Categoria:** [[.:start|Validazione e fiducia]] \\ **Complessità:** Media \\ **Prerequisiti:** Certificati, Trust Store \\ **Tempo stimato:** 10-15 minuti ---- ===== Descrizione ===== Questo scenario descrive la **costruzione di una catena di certificati** (Chain Building) da un certificato End-Entity fino al Trust Anchor. Il Chain Building è il primo passo della validazione dei certificati. **Processo:** - Certificato End-Entity → trovare emittente - Emittente → trovare suo emittente - Ripetere fino a raggiungere il Trust Anchor ---- ===== Workflow ===== flowchart BT EE[Certificato End-Entity] --> INT[Intermediate-CA] INT --> ROOT[Root-CA] ROOT --> TRUST{Nel Trust Store?} TRUST -->|Si| OK[Chain completa] TRUST -->|No| FAIL[Chain incompleta] style OK fill:#e8f5e9 style FAIL fill:#ffebee ---- ===== Esempio codice (C#) ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using System.Security.Cryptography.X509Certificates; using var ctx = PqCryptoContext.Initialize(); // Caricare certificato da validare var serverCert = ctx.LoadCertificate("server.crt.pem"); // Configurare Trust Store using var trustStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine); trustStore.Open(OpenFlags.ReadOnly); // Certificati Intermediate (opzionale) var intermediates = new X509Certificate2Collection(); intermediates.Add(ctx.LoadCertificate("intermediate-ca.crt.pem")); // Configurare Chain Builder var chain = new X509Chain(); chain.ChainPolicy.ExtraStore.AddRange(intermediates); chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; // Solo Chain Building chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags; // Solo costruire chain // Costruire chain bool built = chain.Build(serverCert); Console.WriteLine($"Chain Building: {(built ? "Successo" : "Fallito")}"); Console.WriteLine($"Lunghezza chain: {chain.ChainElements.Count}"); foreach (var element in chain.ChainElements) { Console.WriteLine($" {element.ChainElementStatus.Length} Status"); Console.WriteLine($" Subject: {element.Certificate.Subject}"); Console.WriteLine($" Emittente: {element.Certificate.Issuer}"); } ---- ===== Fetching automatico AIA ===== Authority Information Access (AIA) permette il caricamento automatico di certificati Intermediate mancanti: public X509Certificate2Collection FetchIntermediatesViaAia(X509Certificate2 cert) { var intermediates = new X509Certificate2Collection(); var current = cert; while (true) { // Leggere estensione AIA var aiaUrl = GetCaIssuersUrl(current); if (string.IsNullOrEmpty(aiaUrl)) break; // Scaricare certificato emittente using var http = new HttpClient(); var certData = http.GetByteArrayAsync(aiaUrl).Result; var issuer = new X509Certificate2(certData); intermediates.Add(issuer); // Self-signed = Root raggiunta if (issuer.Subject == issuer.Issuer) break; current = issuer; } return intermediates; } private string? GetCaIssuersUrl(X509Certificate2 cert) { var aia = cert.Extensions["1.3.6.1.5.5.7.1.1"]; // AIA OID if (aia == null) return null; // Parsare AIA (semplificato) var asnData = new AsnReader(aia.RawData, AsnEncodingRules.DER); // ... estrarre URL CA Issuers return null; // Implementazione dipende dalla struttura ASN.1 } ---- ===== Chain Building con certificati PQ ===== public class PqChainBuilder { public X509Chain BuildPqChain(X509Certificate2 endEntity, PqCryptoContext ctx) { var chain = new X509Chain(); // Attivare validazione specifica PQ chain.ChainPolicy.ApplicationPolicy.Add(new Oid("1.3.6.1.5.5.7.3.1")); // serverAuth chain.ChainPolicy.CertificatePolicy.Add(new Oid("2.5.29.32.0")); // anyPolicy // Trust Store personalizzato con Root-CA PQ var pqTrustStore = new X509Certificate2Collection(); pqTrustStore.Add(ctx.LoadCertificate("pq-root-ca.crt.pem")); chain.ChainPolicy.CustomTrustStore.AddRange(pqTrustStore); chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust; chain.Build(endEntity); return chain; } } ---- ===== Risoluzione problemi Chain Building ===== ^ Stato ^ Significato ^ Soluzione ^ | **PartialChain** | Intermediate mancante | Usare AIA o aggiungere manualmente | | **UntrustedRoot** | Root non nel Trust Store | Aggiungere Root al Trust Store | | **NotSignatureValid** | Firma non valida | Certificato danneggiato/errato | | **RevocationStatusUnknown** | CRL/OCSP non raggiungibile | Adattare controllo revoca | // Analizzare stato chain foreach (var element in chain.ChainElements) { foreach (var status in element.ChainElementStatus) { Console.WriteLine($" {element.Certificate.Subject}"); Console.WriteLine($" Stato: {status.Status}"); Console.WriteLine($" Info: {status.StatusInformation}"); } } ---- ===== Requisiti specifici per settore ===== ^ Settore ^ Profondità chain ^ Trust Store ^ Particolarità ^ | **WebPKI** | Max. 3 | Browser Root Store | Regole CA/B Forum | | **Enterprise** | Variabile | Root Store personalizzato | Gerarchia propria | | **Energia/SCADA** | 2-3 | Store offline | Sistemi air-gap | | **Sanità** | 3-4 | TSP qualificati | Conforme eIDAS | ---- ===== Scenari correlati ===== ^ Relazione ^ Scenario ^ Descrizione ^ | **Passo successivo** | [[.:chain_validation|5.2 Validazione Chain]] | Validazione completa | | **Prerequisito** | [[it:int:pqcrypt:szenarien:pki:trust_store_konfigurieren|1.4 Trust Store]] | Trust Anchors | | **Correlato** | [[.:revocation_check|5.3 Controllo revoca]] | Verifica revoca | ---- << [[.:start|← Panoramica validazione]] | [[it:int:pqcrypt:szenarien:start|↑ Scenari]] | [[.:chain_validation|5.2 Validazione Chain →]] >> {{tag>scenario validazione chain-building x509 trust}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//