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:
- Signaturvalidität - Jedes Zertifikat vom Issuer signiert
- Zeitvalidität - Alle Zertifikate innerhalb Gültigkeitszeitraum
- Key Usage - Erlaubte Verwendungszwecke
- Path Length - BasicConstraints pathLenConstraint
- Policy Constraints - Zertifikatsrichtlinien
- Name Constraints - Erlaubte/verbotene Namen
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
Zuletzt geändert: den 29.01.2026 um 15:13