Szenario 5.2: Chain Validation

Kategorie: Validierung & Vertrauen
Komplexität: ⭐⭐⭐⭐ (Hoch)
Voraussetzungen: Aufgebaute Zertifikatskette
Geschätzte Zeit: 15-20 Minuten


Beschreibung

Dieses Szenario beschreibt die vollständige Validierung einer Zertifikatskette nach RFC 5280. Die Validierung prüft:


Workflow

flowchart TD BUILD[Chain Building] --> SIG[Signatur prüfen] SIG --> TIME[Zeitvalidität] TIME --> KU[Key Usage] KU --> PATH[Path Length] PATH --> POLICY[Policy Constraints] POLICY --> NAME[Name Constraints] NAME --> REV[Revocation Check] REV --> OK{Alle OK?} OK -->|Ja| VALID[Zertifikat gültig] OK -->|Nein| INVALID[Zertifikat ungültig] style VALID fill:#e8f5e9 style INVALID fill:#ffebee


Code-Beispiel (C#)

using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
using System.Security.Cryptography.X509Certificates;
 
using var ctx = PqCryptoContext.Initialize();
 
// Zertifikat laden
var serverCert = ctx.LoadCertificate("server.crt.pem");
 
// Vollständige Chain-Validierung
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;
 
// Zusätzliche Intermediate-Zertifikate
chain.ChainPolicy.ExtraStore.Add(ctx.LoadCertificate("intermediate-ca.crt.pem"));
 
// Chain bauen und validieren
bool isValid = chain.Build(serverCert);
 
// Ergebnis auswerten
Console.WriteLine($"Chain-Validierung: {(isValid ? "GÜLTIG" : "UNGÜLTIG")}");
 
if (!isValid)
{
    foreach (var element in chain.ChainElements)
    {
        foreach (var status in element.ChainElementStatus)
        {
            Console.WriteLine($"  {element.Certificate.Subject}");
            Console.WriteLine($"    Fehler: {status.Status}");
            Console.WriteLine($"    Details: {status.StatusInformation}");
        }
    }
}

Detaillierte Validierung

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);
        }
 
        // Zusätzliche PQ-Prüfungen
        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);
            }
        }
 
        // Custom Trust Store
        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;
 
            // Prüfe ob PQ-Algorithmus verwendet wird
            if (!IsPqAlgorithm(algorithm))
            {
                result.Warnings.Add($"{cert.Subject}: Kein PQ-Algorithmus ({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
        };
    }
}

Validierungs-Optionen

public class ValidationOptions
{
    // Zeitpunkt der Validierung
    public DateTime? ValidationTime { get; set; }
 
    // Revocation-Prüfung
    public bool CheckRevocation { get; set; } = true;
 
    // Extended Key Usage
    public Oid? RequiredEku { get; set; }
 
    // Certificate Policies
    public List<Oid>? RequiredPolicies { get; set; }
 
    // Custom Trust Store
    public X509Certificate2Collection? CustomTrustStore { get; set; }
 
    // PQ-Anforderungen
    public bool RequirePostQuantum { get; set; }
 
    // Timeout für Online-Prüfungen
    public TimeSpan UrlTimeout { get; set; } = TimeSpan.FromSeconds(30);
}
 
// Beispiel: TLS-Server-Validierung
var tlsOptions = new ValidationOptions
{
    RequiredEku = new Oid("1.3.6.1.5.5.7.3.1"),  // serverAuth
    CheckRevocation = true,
    RequirePostQuantum = true
};
 
// Beispiel: Code-Signing-Validierung
var codeSigningOptions = new ValidationOptions
{
    RequiredEku = new Oid("1.3.6.1.5.5.7.3.3"),  // codeSigning
    CheckRevocation = true,
    ValidationTime = signatureTimestamp  // Zeitpunkt der Signatur
};

Chain Status Codes

Status Bedeutung Kritisch? Lösung
NoError Keine Fehler Nein -
NotTimeValid Abgelaufen/noch nicht gültig Ja Renewal
NotTimeNested Zeiträume überlappen nicht Ja Chain korrigieren
Revoked Widerrufen Ja Neues Zertifikat
NotSignatureValid Signatur ungültig Ja Chain prüfen
NotValidForUsage Falscher Verwendungszweck Ja Richtiges Zertifikat
UntrustedRoot Root nicht vertrauenswürdig Ja Trust Store
RevocationStatusUnknown CRL/OCSP nicht erreichbar Warnung Offline-Check
PartialChain Chain unvollständig Ja Intermediates hinzufügen

Branchenspezifische Validierung

Branche Zusätzliche Prüfungen Policy OIDs
WebPKI CT-Logs, EV-Policies CA/B Forum
eIDAS QC-Statements, TSL-Check 0.4.0.194121.1.*
Healthcare Berufsattribute gematik OIDs
Automotive ECU-Policies V2X-spezifisch

Verwandte Szenarien

Beziehung Szenario Beschreibung
Voraussetzung 5.1 Chain Building Chain aufbauen
Nächster Schritt 5.3 Revocation Check Widerrufsprüfung
Verwandt 5.4 Policy Validation Policy-Prüfung

« ← 5.1 Chain Building | ↑ Validierung-Übersicht | 5.3 Revocation Check → »


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