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:

  1. Končni certifikat → iskanje izdajatelja
  2. Izdajatelj → iskanje njegovega izdajatelja
  3. 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