====== 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}}