Scenario 5.1: Chain Building

Categoria: 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:

  1. Certificato End-Entity → trovare emittente
  2. Emittente → trovare suo emittente
  3. 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 5.2 Validazione Chain Validazione completa
Prerequisito 1.4 Trust Store Trust Anchors
Correlato 5.3 Controllo revoca Verifica revoca

« ← Panoramica validazione | ↑ Scenari | 5.2 Validazione Chain → »


Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional

Zuletzt geändert: il 30/01/2026 alle 07:03