~~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//