====== Razred RevocationExtensions ====== Razširitvene metode za preverjanje preklica certifikatov. ---- ===== Definicija ===== namespace WvdS.System.Security.Cryptography.X509Certificates; public static class RevocationExtensions ---- ===== Metode ===== ^ Metoda ^ Opis ^ | IsRevoked | Preveri ali je certifikat preklican | | FetchCrlAsync | Naloži CRL z URL-ja (iz certifikatne razširitve) | | CheckRevocationAsync | Kombinirano: naloži CRL in preveri preklic | | GetCrlDistributionPoints | Ekstrahira CRL-URL-je iz certifikata | | GetOcspUrls | Ekstrahira OCSP-URL-je iz certifikata | ---- ===== Preverjanje preklica ===== **Z obstoječim 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"); // Preverjanje s preverjanjem podpisa RevocationResult result = certificate.IsRevoked(crlData, caCert, CryptoMode.Hybrid); if (result.Success) { if (result.IsRevoked) { Console.WriteLine($"Certifikat preklican dne: {result.RevocationDate}"); Console.WriteLine($"Razlog: {result.Reason}"); } else { Console.WriteLine("Certifikat je veljaven"); } } else { Console.WriteLine($"Napaka: {result.ErrorMessage}"); } **Samodejno nalaganje CRL:** // Naloži CRL z URL-ja iz CDP-razširitve certifikata RevocationResult result = await certificate.CheckRevocationAsync( caCert, mode: CryptoMode.Hybrid); ---- ===== Nalaganje CRL ===== // Samo nalaganje CRL, brez preverjanja byte[]? crlData = await certificate.FetchCrlAsync(); if (crlData != null) { File.WriteAllBytes("downloaded.crl", crlData); } **Z lastnim HttpClient:** using var httpClient = new HttpClient(); httpClient.Timeout = TimeSpan.FromSeconds(10); byte[]? crlData = await certificate.FetchCrlAsync(httpClient); ---- ===== Branje CRL-Distribution-Points ===== IReadOnlyList crlUrls = certificate.GetCrlDistributionPoints(); foreach (var url in crlUrls) { Console.WriteLine($"CRL URL: {url}"); } // Hitro preverjanje bool hasCdp = certificate.HasCrlDistributionPoints(); ---- ===== Branje OCSP-URL-jev ===== IReadOnlyList ocspUrls = certificate.GetOcspUrls(); foreach (var url in ocspUrls) { Console.WriteLine($"OCSP Responder: {url}"); } // Hitro preverjanje bool hasOcsp = certificate.HasOcspUrls(); ---- ===== Razred RevocationResult ===== ^ Lastnost ^ Tip ^ Opis ^ | ''IsRevoked'' | bool | Certifikat je preklican | | ''RevocationDate'' | DateTimeOffset? | Čas preklica | | ''Reason'' | CrlReason? | Razlog preklica | | ''CrlVerified'' | bool | CRL-podpis je bil preverjen | | ''ErrorMessage'' | string? | Sporočilo o napaki (če je preverjanje spodletelo) | | ''Success'' | bool | Preverjanje je bilo uspešno | ---- ===== CRL-predpomnilnik ===== Za pogoste preverjanja s samodejnim predpomnenjem: using var cache = new CrlCache(defaultCacheDuration: TimeSpan.FromHours(1)); // Preverjanje s samodejnim CRL-predpomnenjem RevocationResult result1 = await cache.CheckRevocationAsync(cert1, caCert); RevocationResult result2 = await cache.CheckRevocationAsync(cert2, caCert); // CRL iz predpomnilnika // Čiščenje predpomnilnika cache.Clear(); **Z lastnim HttpClient:** using var httpClient = new HttpClient(); using var cache = new CrlCache(httpClient, TimeSpan.FromMinutes(30)); // Preverjanje več certifikatov foreach (var cert in certificates) { var result = await cache.CheckRevocationAsync(cert, caCert, CryptoMode.Hybrid); // ... } ---- ===== Integracija z X509Chain ===== Za popolno validacijo verige s CRL-preverjanjem: 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("Certifikat v verigi preklican"); } } } ---- ===== Offline-preverjanje ===== Za air-gapped sisteme brez omrežnega dostopa: // CRL-ji predhodno naloženi in shranjeni var crlFiles = new Dictionary { ["CN=Root CA"] = File.ReadAllBytes("root.crl"), ["CN=Issuing CA"] = File.ReadAllBytes("issuing.crl") }; // Offline-preverjanje RevocationResult result = certificate.IsRevoked(crlFiles["CN=Issuing CA"], caCert); ---- ===== Najboljše prakse ===== * **Aktivirajte CRL-predpomnjenje:** Uporabljajte ''CrlCache'' za ponavljajoča preverjanja * **Nastavite časovne omejitve:** Konfigurirajte HttpClient-časovne omejitve za omrežne operacije * **Implementirajte nadomestno rešitev:** Preverite OCSP če CRL ni na voljo * **Offline-kopije:** Hranite lokalne CRL-kopije za kritične sisteme ---- ===== Glej tudi ===== * [[.:certificaterevocationlistextensions|CertificateRevocationListExtensions]] - Ustvarjanje CRL * [[.:x509chainextensions|X509ChainExtensions]] - Validacija verige * [[sl:int:pqcrypt:konzepte:revocation|Koncept preklica]] ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional// {{tag>crl revocation preklic ocsp}}