~~NOTOC~~ ====== Scenarij 5.1: Izgradnja lanca ====== **Kategorija:** [[.:start|Validacija i povjerenje]] \\ **Složenost:** ⭐⭐⭐ (Srednja) \\ **Preduvjeti:** Certifikati, Trust Store \\ **Procijenjeno vrijeme:** 10-15 minuta ---- ===== Opis ===== Ovaj scenarij opisuje **izgradnju lanca certifikata** (Chain Building) od certifikata krajnjeg entiteta do Trust Anchora. Izgradnja lanca je prvi korak validacije certifikata. **Proces:** - End-Entity certifikat → pronaći Issuera - Issuer → pronaći njegovog Issuera - Ponavljati dok se ne dosegne Trust Anchor ---- ===== Tijek rada ===== flowchart BT EE[End-Entity certifikat] --> INT[Intermediate-CA] INT --> ROOT[Root-CA] ROOT --> TRUST{U Trust Store-u?} TRUST -->|Da| OK[Lanac potpun] TRUST -->|Ne| FAIL[Lanac nepotpun] style OK fill:#e8f5e9 style FAIL fill:#ffebee ---- ===== Primjer koda (C#) ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using System.Security.Cryptography.X509Certificates; using var ctx = PqCryptoContext.Initialize(); // Učitavanje certifikata za validaciju var serverCert = ctx.LoadCertificate("server.crt.pem"); // Konfiguracija Trust Store-a using var trustStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine); trustStore.Open(OpenFlags.ReadOnly); // Intermediate certifikati (opcionalno) var intermediates = new X509Certificate2Collection(); intermediates.Add(ctx.LoadCertificate("intermediate-ca.crt.pem")); // Konfiguracija Chain Buildera var chain = new X509Chain(); chain.ChainPolicy.ExtraStore.AddRange(intermediates); chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; // Prvo samo izgradnja lanca chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags; // Samo izgraditi lanac // Izgradnja lanca bool built = chain.Build(serverCert); Console.WriteLine($"Izgradnja lanca: {(built ? "Uspješno" : "Neuspješno")}"); Console.WriteLine($"Duljina lanca: {chain.ChainElements.Count}"); foreach (var element in chain.ChainElements) { Console.WriteLine($" {element.ChainElementStatus.Length} Status"); Console.WriteLine($" Subject: {element.Certificate.Subject}"); Console.WriteLine($" Issuer: {element.Certificate.Issuer}"); } ---- ===== Automatsko AIA dohvaćanje ===== Authority Information Access (AIA) omogućuje automatsko učitavanje Intermediate certifikata koji nedostaju: public X509Certificate2Collection FetchIntermediatesViaAia(X509Certificate2 cert) { var intermediates = new X509Certificate2Collection(); var current = cert; while (true) { // Čitanje AIA ekstenzije var aiaUrl = GetCaIssuersUrl(current); if (string.IsNullOrEmpty(aiaUrl)) break; // Preuzimanje Issuer certifikata using var http = new HttpClient(); var certData = http.GetByteArrayAsync(aiaUrl).Result; var issuer = new X509Certificate2(certData); intermediates.Add(issuer); // Self-signed = Root dosegnut 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; // Parsiranje AIA (pojednostavljeno) var asnData = new AsnReader(aia.RawData, AsnEncodingRules.DER); // ... Ekstrakcija CA Issuers URL-a return null; // Implementacija ovisi o ASN.1 strukturi } ---- ===== Izgradnja lanca s PQ certifikatima ===== 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 // Prilagođeni Trust Store s PQ-Root-CA 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; } } ---- ===== Otklanjanje grešaka pri izgradnji lanca ===== ^ Status ^ Značenje ^ Rješenje ^ | **PartialChain** | Nedostaje Intermediate | Koristiti AIA ili ručno dodati | | **UntrustedRoot** | Root nije u Trust Store-u | Dodati Root u Trust Store | | **NotSignatureValid** | Nevaljani potpis | Certifikat oštećen/pogrešan | | **RevocationStatusUnknown** | CRL/OCSP nedostupan | Prilagoditi provjeru opoziva | // Analiza Chain statusa 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}"); } } ---- ===== Specifični zahtjevi po industrijama ===== ^ Industrija ^ Dubina lanca ^ Trust Store ^ Posebnost ^ | **WebPKI** | Maks. 3 | Browser Root Store | CA/B Forum pravila | | **Enterprise** | Varijabilno | Prilagođeni Root Store | Vlastita hijerarhija | | **Energetika/SCADA** | 2-3 | Offline Store | Air-Gap sustavi | | **Zdravstvo** | 3-4 | Kvalificirani TSP | eIDAS-sukladno | ---- ===== Povezani scenariji ===== ^ Odnos ^ Scenarij ^ Opis ^ | **Sljedeći korak** | [[.:chain_validation|5.2 Validacija lanca]] | Potpuna validacija | | **Preduvjet** | [[hr:int:pqcrypt:szenarien:pki:trust_store_konfigurieren|1.4 Trust Store]] | Trust Anchori | | **Povezano** | [[.:revocation_check|5.3 Provjera opoziva]] | Provjera opoziva | ---- << [[.:start|← Pregled validacije]] | [[hr:int:pqcrypt:szenarien:start|↑ Scenariji]] | [[.:chain_validation|5.2 Validacija lanca →]] >> {{tag>scenarij validacija izgradnja-lanca x509 povjerenje}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//