~~NOTOC~~
====== Szenario 5.2: Chain Validation ======
**Kategorie:** [[.:start|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? 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** | [[.:chain_building|5.1 Chain Building]] | Chain aufbauen |
| **Nächster Schritt** | [[.:revocation_check|5.3 Revocation Check]] | Widerrufsprüfung |
| **Verwandt** | [[.:policy_validation|5.4 Policy Validation]] | Policy-Prüfung |
----
<< [[.:chain_building|← 5.1 Chain Building]] | [[.:start|↑ Validierung-Übersicht]] | [[.:revocation_check|5.3 Revocation Check →]] >>
{{tag>szenario validierung chain x509 rfc5280}}
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//