~~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//