~~NOTOC~~ ====== Scenarij 5.1: Gradnja verige ====== **Kategorija:** [[.:start|Validacija in zaupanje]] \\ **Kompleksnost:** ⭐⭐⭐ (Srednja) \\ **Predpogoji:** Certifikati, shramba zaupanja \\ **Predviden čas:** 10-15 minut ---- ===== Opis ===== Ta scenarij opisuje **gradnjo verige certifikatov** (Chain Building) od končnega certifikata do sidra zaupanja. Gradnja verige je prvi korak validacije certifikatov. **Proces:** - Končni certifikat → iskanje izdajatelja - Izdajatelj → iskanje njegovega izdajatelja - Ponavljanje dokler ni doseženo sidro zaupanja ---- ===== Potek dela ===== flowchart BT EE[Končni certifikat] --> INT[Vmesni CA] INT --> ROOT[Korenski CA] ROOT --> TRUST{V shrambi zaupanja?} TRUST -->|Da| OK[Veriga popolna] TRUST -->|Ne| FAIL[Veriga nepopolna] style OK fill:#e8f5e9 style FAIL fill:#ffebee ---- ===== Primer kode (C#) ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using System.Security.Cryptography.X509Certificates; using var ctx = PqCryptoContext.Initialize(); // Nalaganje certifikata za validacijo var serverCert = ctx.LoadCertificate("server.crt.pem"); // Konfiguracija shrambe zaupanja using var trustStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine); trustStore.Open(OpenFlags.ReadOnly); // Vmesni certifikati (opcijsko) var intermediates = new X509Certificate2Collection(); intermediates.Add(ctx.LoadCertificate("intermediate-ca.crt.pem")); // Konfiguracija graditelja verige var chain = new X509Chain(); chain.ChainPolicy.ExtraStore.AddRange(intermediates); chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; // Najprej samo gradnja verige chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags; // Samo gradnja verige // Gradnja verige bool built = chain.Build(serverCert); Console.WriteLine($"Gradnja verige: {(built ? "Uspešna" : "Neuspešna")}"); Console.WriteLine($"Dolžina verige: {chain.ChainElements.Count}"); foreach (var element in chain.ChainElements) { Console.WriteLine($" {element.ChainElementStatus.Length} statusov"); Console.WriteLine($" Subject: {element.Certificate.Subject}"); Console.WriteLine($" Issuer: {element.Certificate.Issuer}"); } ---- ===== Samodejno pridobivanje prek AIA ===== Authority Information Access (AIA) omogoča samodejno nalaganje manjkajočih vmesnih certifikatov: public X509Certificate2Collection FetchIntermediatesViaAia(X509Certificate2 cert) { var intermediates = new X509Certificate2Collection(); var current = cert; while (true) { // Branje AIA razširitve var aiaUrl = GetCaIssuersUrl(current); if (string.IsNullOrEmpty(aiaUrl)) break; // Prenos certifikata izdajatelja using var http = new HttpClient(); var certData = http.GetByteArrayAsync(aiaUrl).Result; var issuer = new X509Certificate2(certData); intermediates.Add(issuer); // Self-signed = dosežen korenski if (issuer.Subject == issuer.Issuer) break; current = issuer; } return intermediates; } private string? GetCaIssuersUrl(X509Certificate2 cert) { var aia = cert.Extensions["1.3.6.1.5.5.7.1.1"]; // AIA OID if (aia == null) return null; // Razčlenjevanje AIA (poenostavljeno) var asnData = new AsnReader(aia.RawData, AsnEncodingRules.DER); // ... ekstrakcija CA Issuers URL return null; // Implementacija odvisna od ASN.1 strukture } ---- ===== Gradnja verige s PQ certifikati ===== public class PqChainBuilder { public X509Chain BuildPqChain(X509Certificate2 endEntity, PqCryptoContext ctx) { var chain = new X509Chain(); // Aktivacija PQ specifične validacije chain.ChainPolicy.ApplicationPolicy.Add(new Oid("1.3.6.1.5.5.7.3.1")); // serverAuth chain.ChainPolicy.CertificatePolicy.Add(new Oid("2.5.29.32.0")); // anyPolicy // Prilagojena shramba zaupanja s PQ korenskimi CA-ji var pqTrustStore = new X509Certificate2Collection(); pqTrustStore.Add(ctx.LoadCertificate("pq-root-ca.crt.pem")); chain.ChainPolicy.CustomTrustStore.AddRange(pqTrustStore); chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust; chain.Build(endEntity); return chain; } } ---- ===== Odpravljanje napak pri gradnji verige ===== ^ Status ^ Pomen ^ Rešitev ^ | **PartialChain** | Manjka vmesni certifikat | Uporaba AIA ali ročno dodajanje | | **UntrustedRoot** | Korenski ni v shrambi zaupanja | Dodajanje korenskega v shrambo zaupanja | | **NotSignatureValid** | Neveljaven podpis | Certifikat poškodovan/napačen | | **RevocationStatusUnknown** | CRL/OCSP nedosegljiv | Prilagoditev preverjanja preklica | // Analiza statusa verige foreach (var element in chain.ChainElements) { foreach (var status in element.ChainElementStatus) { Console.WriteLine($" {element.Certificate.Subject}"); Console.WriteLine($" Status: {status.Status}"); Console.WriteLine($" Info: {status.StatusInformation}"); } } ---- ===== Panožne zahteve ===== ^ Panoga ^ Globina verige ^ Shramba zaupanja ^ Posebnost ^ | **WebPKI** | Največ 3 | Shramba korenskih certifikatov brskalnika | Pravila CA/B Forum | | **Podjetja** | Spremenljiva | Prilagojena shramba korenskih certifikatov | Lastna hierarhija | | **Energetika/SCADA** | 2-3 | Shramba brez povezave | Air-Gap sistemi | | **Zdravstvo** | 3-4 | Kvalificirani TSP | Skladno z eIDAS | ---- ===== Povezani scenariji ===== ^ Povezava ^ Scenarij ^ Opis ^ | **Naslednji korak** | [[.:chain_validation|5.2 Validacija verige]] | Popolna validacija | | **Predpogoj** | [[sl:int:pqcrypt:szenarien:pki:trust_store_konfigurieren|1.4 Shramba zaupanja]] | Sidra zaupanja | | **Povezano** | [[.:revocation_check|5.3 Preverjanje preklica]] | Preverjanje preklica | ---- << [[.:start|← Pregled validacije]] | [[sl:int:pqcrypt:szenarien:start|↑ Scenariji]] | [[.:chain_validation|5.2 Validacija verige →]] >> {{tag>scenarij validacija gradnja-verige x509 zaupanje}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//