Szenario 5.1: Chain Building

Kategorie: Validierung & Vertrauen
Komplexität: ⭐⭐⭐ (Mittel)
Voraussetzungen: Zertifikate, Trust Store
Geschätzte Zeit: 10-15 Minuten


Beschreibung

Dieses Szenario beschreibt den Aufbau einer Zertifikatskette (Chain Building) von einem End-Entity-Zertifikat bis zum Trust Anchor. Chain Building ist der erste Schritt der Zertifikatsvalidierung.

Prozess:

  1. End-Entity Zertifikat → Issuer finden
  2. Issuer → dessen Issuer finden
  3. Wiederholen bis Trust Anchor erreicht

Workflow

flowchart BT EE[End-Entity Zertifikat] --> INT[Intermediate-CA] INT --> ROOT[Root-CA] ROOT --> TRUST{Im Trust Store?} TRUST -->|Ja| OK[Chain vollständig] TRUST -->|Nein| FAIL[Chain unvollständig] style OK fill:#e8f5e9 style FAIL fill:#ffebee


Code-Beispiel (C#)

using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
using System.Security.Cryptography.X509Certificates;
 
using var ctx = PqCryptoContext.Initialize();
 
// Zu validierendes Zertifikat laden
var serverCert = ctx.LoadCertificate("server.crt.pem");
 
// Trust Store konfigurieren
using var trustStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
trustStore.Open(OpenFlags.ReadOnly);
 
// Intermediate-Zertifikate (optional)
var intermediates = new X509Certificate2Collection();
intermediates.Add(ctx.LoadCertificate("intermediate-ca.crt.pem"));
 
// Chain Builder konfigurieren
var chain = new X509Chain();
chain.ChainPolicy.ExtraStore.AddRange(intermediates);
chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;  // Erst nur Chain Building
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags;  // Nur Chain aufbauen
 
// Chain bauen
bool built = chain.Build(serverCert);
 
Console.WriteLine($"Chain Building: {(built ? "Erfolgreich" : "Fehlgeschlagen")}");
Console.WriteLine($"Chain-Länge: {chain.ChainElements.Count}");
 
foreach (var element in chain.ChainElements)
{
    Console.WriteLine($"  {element.ChainElementStatus.Length} Status");
    Console.WriteLine($"    Subject: {element.Certificate.Subject}");
    Console.WriteLine($"    Issuer: {element.Certificate.Issuer}");
}

Automatisches AIA-Fetching

Authority Information Access (AIA) ermöglicht automatisches Laden fehlender Intermediate-Zertifikate:

public X509Certificate2Collection FetchIntermediatesViaAia(X509Certificate2 cert)
{
    var intermediates = new X509Certificate2Collection();
    var current = cert;
 
    while (true)
    {
        // AIA Extension auslesen
        var aiaUrl = GetCaIssuersUrl(current);
        if (string.IsNullOrEmpty(aiaUrl)) break;
 
        // Issuer-Zertifikat herunterladen
        using var http = new HttpClient();
        var certData = http.GetByteArrayAsync(aiaUrl).Result;
 
        var issuer = new X509Certificate2(certData);
        intermediates.Add(issuer);
 
        // Self-signed = Root erreicht
        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;
 
    // AIA parsen (vereinfacht)
    var asnData = new AsnReader(aia.RawData, AsnEncodingRules.DER);
    // ... CA Issuers URL extrahieren
    return null;  // Implementierung abhängig von ASN.1 Struktur
}

Chain Building mit PQ-Zertifikaten

public class PqChainBuilder
{
    public X509Chain BuildPqChain(X509Certificate2 endEntity, PqCryptoContext ctx)
    {
        var chain = new X509Chain();
 
        // PQ-spezifische Validierung aktivieren
        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
 
        // Custom Trust Store mit PQ-Root-CAs
        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;
    }
}

Chain Building Fehlerbehebung

Status Bedeutung Lösung
PartialChain Intermediate fehlt AIA nutzen oder manuell hinzufügen
UntrustedRoot Root nicht im Trust Store Root zu Trust Store hinzufügen
NotSignatureValid Signatur ungültig Zertifikat beschädigt/falsch
RevocationStatusUnknown CRL/OCSP nicht erreichbar Revocation-Check anpassen
// Chain Status analysieren
foreach (var element in chain.ChainElements)
{
    foreach (var status in element.ChainElementStatus)
    {
        Console.WriteLine($"  {element.Certificate.Subject}");
        Console.WriteLine($"    Status: {status.Status}");
        Console.WriteLine($"    Info: {status.StatusInformation}");
    }
}

Branchenspezifische Anforderungen

Branche Chain-Tiefe Trust Store Besonderheit
WebPKI Max. 3 Browser Root Store CA/B Forum Regeln
Enterprise Variabel Custom Root Store Eigene Hierarchie
Energie/SCADA 2-3 Offline Store Air-Gap Systeme
Healthcare 3-4 Qualifizierte TSP eIDAS-konform

Verwandte Szenarien

Beziehung Szenario Beschreibung
Nächster Schritt 5.2 Chain Validation Vollständige Validierung
Voraussetzung 1.4 Trust Store Trust Anchors
Verwandt 5.3 Revocation Check Widerrufsprüfung

« ← Validierung-Übersicht | ↑ Szenarien | 5.2 Chain Validation → »


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