~~NOTOC~~ ====== Szenario 5.1: Chain Building ====== **Kategorie:** [[.:start|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:** - End-Entity Zertifikat → Issuer finden - Issuer → dessen Issuer finden - 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** | [[.:chain_validation|5.2 Chain Validation]] | Vollständige Validierung | | **Voraussetzung** | [[de:int:pqcrypt:szenarien:pki:trust_store_konfigurieren|1.4 Trust Store]] | Trust Anchors | | **Verwandt** | [[.:revocation_check|5.3 Revocation Check]] | Widerrufsprüfung | ---- << [[.:start|← Validierung-Übersicht]] | [[de:int:pqcrypt:szenarien:start|↑ Szenarien]] | [[.:chain_validation|5.2 Chain Validation →]] >> {{tag>szenario validierung chain-building x509 trust}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//