Scenarij 5.1: Gradnja verige
Kategorija: 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 | 5.2 Validacija verige | Popolna validacija |
| Predpogoj | 1.4 Shramba zaupanja | Sidra zaupanja |
| Povezano | 5.3 Preverjanje preklica | Preverjanje preklica |
« ← Pregled validacije | ↑ Scenariji | 5.2 Validacija verige → »
Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional
Zuletzt geändert: dne 30.01.2026 ob 06:49