====== RevocationExtensions Klasse ====== Extension Methods für die Prüfung von Zertifikatswiderruf. ---- ===== Definition ===== namespace WvdS.System.Security.Cryptography.X509Certificates; public static class RevocationExtensions ---- ===== Methoden ===== ^ Methode ^ Beschreibung ^ | IsRevoked | Prüft ob ein Zertifikat widerrufen ist | | FetchCrlAsync | Lädt CRL von URL (aus Zertifikat-Extension) | | CheckRevocationAsync | Kombiniert: CRL laden und Widerruf prüfen | | GetCrlDistributionPoints | Extrahiert CRL-URLs aus Zertifikat | | GetOcspUrls | Extrahiert OCSP-URLs aus Zertifikat | ---- ===== Widerruf prüfen ===== **Mit vorhandener CRL:** using System.Security.Cryptography.X509Certificates; using WvdS.System.Security.Cryptography.X509Certificates; var certificate = new X509Certificate2("user.cer"); byte[] crlData = File.ReadAllBytes("ca.crl"); var caCert = new X509Certificate2("ca.cer"); // Prüfen mit Signaturverifizierung RevocationResult result = certificate.IsRevoked(crlData, caCert, CryptoMode.Hybrid); if (result.Success) { if (result.IsRevoked) { Console.WriteLine($"Zertifikat widerrufen am: {result.RevocationDate}"); Console.WriteLine($"Grund: {result.Reason}"); } else { Console.WriteLine("Zertifikat ist gültig"); } } else { Console.WriteLine($"Fehler: {result.ErrorMessage}"); } **CRL automatisch laden:** // Lädt CRL von der URL aus der CDP-Extension des Zertifikats RevocationResult result = await certificate.CheckRevocationAsync( caCert, mode: CryptoMode.Hybrid); ---- ===== CRL laden ===== // Nur CRL laden, ohne Prüfung byte[]? crlData = await certificate.FetchCrlAsync(); if (crlData != null) { File.WriteAllBytes("downloaded.crl", crlData); } **Mit eigenem HttpClient:** using var httpClient = new HttpClient(); httpClient.Timeout = TimeSpan.FromSeconds(10); byte[]? crlData = await certificate.FetchCrlAsync(httpClient); ---- ===== CRL-Distribution-Points auslesen ===== IReadOnlyList crlUrls = certificate.GetCrlDistributionPoints(); foreach (var url in crlUrls) { Console.WriteLine($"CRL URL: {url}"); } // Schnelle Prüfung bool hasCdp = certificate.HasCrlDistributionPoints(); ---- ===== OCSP-URLs auslesen ===== IReadOnlyList ocspUrls = certificate.GetOcspUrls(); foreach (var url in ocspUrls) { Console.WriteLine($"OCSP Responder: {url}"); } // Schnelle Prüfung bool hasOcsp = certificate.HasOcspUrls(); ---- ===== RevocationResult Klasse ===== ^ Eigenschaft ^ Typ ^ Beschreibung ^ | ''IsRevoked'' | bool | Zertifikat ist widerrufen | | ''RevocationDate'' | DateTimeOffset? | Zeitpunkt des Widerrufs | | ''Reason'' | CrlReason? | Widerrufsgrund | | ''CrlVerified'' | bool | CRL-Signatur wurde verifiziert | | ''ErrorMessage'' | string? | Fehlermeldung (falls Prüfung fehlschlug) | | ''Success'' | bool | Prüfung war erfolgreich | ---- ===== CRL-Cache ===== Für häufige Prüfungen mit automatischem Caching: using var cache = new CrlCache(defaultCacheDuration: TimeSpan.FromHours(1)); // Prüfung mit automatischem CRL-Caching RevocationResult result1 = await cache.CheckRevocationAsync(cert1, caCert); RevocationResult result2 = await cache.CheckRevocationAsync(cert2, caCert); // CRL aus Cache // Cache leeren cache.Clear(); **Mit eigenem HttpClient:** using var httpClient = new HttpClient(); using var cache = new CrlCache(httpClient, TimeSpan.FromMinutes(30)); // Mehrere Zertifikate prüfen foreach (var cert in certificates) { var result = await cache.CheckRevocationAsync(cert, caCert, CryptoMode.Hybrid); // ... } ---- ===== Integration mit X509Chain ===== Für vollständige Kettenvalidierung mit CRL-Prüfung: using var chain = new X509Chain(); chain.ChainPolicy.RevocationMode = X509RevocationMode.Online; chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain; bool valid = chain.Build(certificate, CryptoMode.Hybrid); if (!valid) { foreach (var status in chain.ChainStatus) { if (status.Status == X509ChainStatusFlags.Revoked) { Console.WriteLine("Zertifikat in Kette widerrufen"); } } } ---- ===== Offline-Prüfung ===== Für Air-gapped Systeme ohne Netzwerkzugang: // CRLs vorab herunterladen und speichern var crlFiles = new Dictionary { ["CN=Root CA"] = File.ReadAllBytes("root.crl"), ["CN=Issuing CA"] = File.ReadAllBytes("issuing.crl") }; // Offline-Prüfung RevocationResult result = certificate.IsRevoked(crlFiles["CN=Issuing CA"], caCert); ---- ===== Best Practices ===== * **CRL-Caching aktivieren:** Verwende ''CrlCache'' für wiederholte Prüfungen * **Timeouts setzen:** Konfiguriere HttpClient-Timeouts für Netzwerkoperationen * **Fallback implementieren:** Prüfe OCSP wenn CRL nicht verfügbar * **Offline-Kopien:** Halte lokale CRL-Kopien für kritische Systeme vor ---- ===== Siehe auch ===== * [[.:certificaterevocationlistextensions|CertificateRevocationListExtensions]] - CRL erstellen * [[.:x509chainextensions|X509ChainExtensions]] - Kettenvalidierung * [[de:int:pqcrypt:konzepte:revocation|Revocation-Konzept]] ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional// {{tag>crl revocation widerruf ocsp}}