~~NOTOC~~
====== Scenario 5.2: Validazione Chain ======
**Categoria:** [[.:start|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:
* **Validità firma** - Ogni certificato firmato dall'emittente
* **Validità temporale** - Tutti i certificati nel periodo di validità
* **Key Usage** - Scopi d'uso consentiti
* **Path Length** - BasicConstraints pathLenConstraint
* **Policy Constraints** - Politiche dei certificati
* **Name Constraints** - Nomi consentiti/vietati
----
===== 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? 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** | [[.:chain_building|5.1 Chain Building]] | Costruire chain |
| **Passo successivo** | [[.:revocation_check|5.3 Controllo revoca]] | Verifica revoca |
| **Correlato** | [[.:policy_validation|5.4 Validazione Policy]] | Verifica policy |
----
<< [[.:chain_building|← 5.1 Chain Building]] | [[.:start|↑ Panoramica validazione]] | [[.:revocation_check|5.3 Controllo revoca →]] >>
{{tag>scenario validazione chain x509 rfc5280}}
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//