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