Scenario 5.2: Validazione Chain

Categoria: Validazione e fiducia
Complessità: Alta
Prerequisiti: Catena certificati costruita
Tempo stimato: 15-20 minuti


Descrizione

Questo scenario descrive la validazione completa di una catena di certificati secondo RFC 5280. La validazione verifica:


Workflow

flowchart TD BUILD[Chain Building] --> SIG[Verificare firma] SIG --> TIME[Validità temporale] TIME --> KU[Key Usage] KU --> PATH[Path Length] PATH --> POLICY[Policy Constraints] POLICY --> NAME[Name Constraints] NAME --> REV[Controllo revoca] REV --> OK{Tutto OK?} OK -->|Si| VALID[Certificato valido] OK -->|No| INVALID[Certificato non valido] style VALID fill:#e8f5e9 style INVALID fill:#ffebee


Esempio codice (C#)

using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
using System.Security.Cryptography.X509Certificates;
 
using var ctx = PqCryptoContext.Initialize();
 
// Caricare certificato
var serverCert = ctx.LoadCertificate("server.crt.pem");
 
// Validazione completa della chain
var chain = new X509Chain();
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
chain.ChainPolicy.UrlRetrievalTimeout = TimeSpan.FromSeconds(30);
chain.ChainPolicy.VerificationTime = DateTime.UtcNow;
 
// Certificati Intermediate aggiuntivi
chain.ChainPolicy.ExtraStore.Add(ctx.LoadCertificate("intermediate-ca.crt.pem"));
 
// Costruire e validare chain
bool isValid = chain.Build(serverCert);
 
// Valutare risultato
Console.WriteLine($"Validazione chain: {(isValid ? "VALIDA" : "NON VALIDA")}");
 
if (!isValid)
{
    foreach (var element in chain.ChainElements)
    {
        foreach (var status in element.ChainElementStatus)
        {
            Console.WriteLine($"  {element.Certificate.Subject}");
            Console.WriteLine($"    Errore: {status.Status}");
            Console.WriteLine($"    Dettagli: {status.StatusInformation}");
        }
    }
}

Validazione dettagliata

public class ChainValidator
{
    public ValidationResult ValidateChain(X509Certificate2 certificate, ValidationOptions options)
    {
        var result = new ValidationResult { IsValid = true };
 
        using var chain = new X509Chain();
        ConfigureChainPolicy(chain.ChainPolicy, options);
 
        if (!chain.Build(certificate))
        {
            result.IsValid = false;
            result.Errors = ExtractErrors(chain);
        }
 
        // Verifiche PQ aggiuntive
        if (options.RequirePostQuantum)
        {
            ValidatePqRequirements(chain, result);
        }
 
        return result;
    }
 
    private void ConfigureChainPolicy(X509ChainPolicy policy, ValidationOptions options)
    {
        policy.RevocationMode = options.CheckRevocation
            ? X509RevocationMode.Online
            : X509RevocationMode.NoCheck;
 
        policy.RevocationFlag = X509RevocationFlag.EntireChain;
        policy.VerificationTime = options.ValidationTime ?? DateTime.UtcNow;
 
        // Application Policies (Extended Key Usage)
        if (options.RequiredEku != null)
        {
            policy.ApplicationPolicy.Add(options.RequiredEku);
        }
 
        // Certificate Policies
        if (options.RequiredPolicies != null)
        {
            foreach (var policyOid in options.RequiredPolicies)
            {
                policy.CertificatePolicy.Add(policyOid);
            }
        }
 
        // Trust Store personalizzato
        if (options.CustomTrustStore != null)
        {
            policy.CustomTrustStore.AddRange(options.CustomTrustStore);
            policy.TrustMode = X509ChainTrustMode.CustomRootTrust;
        }
    }
 
    private void ValidatePqRequirements(X509Chain chain, ValidationResult result)
    {
        foreach (var element in chain.ChainElements)
        {
            var cert = element.Certificate;
            var algorithm = cert.PublicKey.Oid.Value;
 
            // Verificare se viene usato algoritmo PQ
            if (!IsPqAlgorithm(algorithm))
            {
                result.Warnings.Add($"{cert.Subject}: Nessun algoritmo PQ ({algorithm})");
            }
        }
    }
 
    private bool IsPqAlgorithm(string oid)
    {
        return oid switch
        {
            "2.16.840.1.101.3.4.3.17" => true,  // ML-DSA-44
            "2.16.840.1.101.3.4.3.18" => true,  // ML-DSA-65
            "2.16.840.1.101.3.4.3.19" => true,  // ML-DSA-87
            _ => false
        };
    }
}

Opzioni di validazione

public class ValidationOptions
{
    // Momento della validazione
    public DateTime? ValidationTime { get; set; }
 
    // Verifica revoca
    public bool CheckRevocation { get; set; } = true;
 
    // Extended Key Usage
    public Oid? RequiredEku { get; set; }
 
    // Certificate Policies
    public List<Oid>? RequiredPolicies { get; set; }
 
    // Trust Store personalizzato
    public X509Certificate2Collection? CustomTrustStore { get; set; }
 
    // Requisiti PQ
    public bool RequirePostQuantum { get; set; }
 
    // Timeout per verifiche online
    public TimeSpan UrlTimeout { get; set; } = TimeSpan.FromSeconds(30);
}
 
// Esempio: Validazione server TLS
var tlsOptions = new ValidationOptions
{
    RequiredEku = new Oid("1.3.6.1.5.5.7.3.1"),  // serverAuth
    CheckRevocation = true,
    RequirePostQuantum = true
};
 
// Esempio: Validazione Code-Signing
var codeSigningOptions = new ValidationOptions
{
    RequiredEku = new Oid("1.3.6.1.5.5.7.3.3"),  // codeSigning
    CheckRevocation = true,
    ValidationTime = signatureTimestamp  // Momento della firma
};

Codici stato chain

Stato Significato Critico? Soluzione
NoError Nessun errore No -
NotTimeValid Scaduto/non ancora valido Si Rinnovo
NotTimeNested Periodi non sovrapposti Si Correggere chain
Revoked Revocato Si Nuovo certificato
NotSignatureValid Firma non valida Si Verificare chain
NotValidForUsage Scopo d'uso errato Si Certificato corretto
UntrustedRoot Root non affidabile Si Trust Store
RevocationStatusUnknown CRL/OCSP non raggiungibile Avviso Verifica offline
PartialChain Chain incompleta Si Aggiungere intermediates

Validazione specifica per settore

Settore Verifiche aggiuntive Policy OID
WebPKI CT-Logs, EV-Policies CA/B Forum
eIDAS QC-Statements, TSL-Check 0.4.0.194121.1.*
Sanità Attributi professionali gematik OID
Automotive ECU-Policies Specifiche V2X

Scenari correlati

Relazione Scenario Descrizione
Prerequisito 5.1 Chain Building Costruire chain
Passo successivo 5.3 Controllo revoca Verifica revoca
Correlato 5.4 Validazione Policy Verifica policy

« ← 5.1 Chain Building | ↑ Panoramica validazione | 5.3 Controllo revoca → »


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