Inhaltsverzeichnis

Scenarij 1.3: Izgradnja višerazinske CA hijerarhije

Kategorija: PKI infrastruktura
Složenost: ⭐⭐⭐⭐ (Visoka)
Preduvjeti: 1.1 Root-CA, 1.2 Intermediate-CA
Procijenjeno vrijeme: 1-2 sata


Opis

Ovaj scenarij opisuje izgradnju višerazinske PKI hijerarhije sa specijaliziranim Intermediate-CA za različite namjene. Dobro strukturirana CA hijerarhija omogućuje fleksibilno upravljanje certifikatima, granularne sigurnosne kontrole i jednostavan opoziv.

Što se kreira:

Prednosti strukturirane hijerarhije:


Modeli hijerarhije

Model A: 2-razinska hijerarhija (Standard)

                         ┌─────────────────────┐
                         │      Root-CA        │
                         │    (ML-DSA-87)      │
                         │    20 godina        │
                         │    pathLen=4        │
                         │    [OFFLINE]        │
                         └──────────┬──────────┘
                                    │
           ┌────────────────────────┼────────────────────────┐
           │                        │                        │
           ▼                        ▼                        ▼
┌─────────────────────┐  ┌─────────────────────┐  ┌─────────────────────┐
│    Server-CA        │  │    Client-CA        │  │   CodeSign-CA       │
│   (ML-DSA-65)       │  │   (ML-DSA-65)       │  │   (ML-DSA-65)       │
│   10 godina         │  │   10 godina         │  │   10 godina         │
│   pathLen=0         │  │   pathLen=0         │  │   pathLen=0         │
│   [ONLINE]          │  │   [ONLINE]          │  │   [HSM]             │
└──────────┬──────────┘  └──────────┬──────────┘  └──────────┬──────────┘
           │                        │                        │
           ▼                        ▼                        ▼
    ┌──────────────┐        ┌──────────────┐        ┌──────────────┐
    │ Server-Certs │        │ Client-Certs │        │ CodeSign-    │
    │ (TLS)        │        │ (mTLS)       │        │ Certifikati  │
    └──────────────┘        └──────────────┘        └──────────────┘

Karakteristike:

Model B: 3-razinska hijerarhija (Enterprise)

                              ┌─────────────────────┐
                              │      Root-CA        │
                              │    (ML-DSA-87)      │
                              │    25 godina        │
                              │    pathLen=3        │
                              │    [OFFLINE/HSM]    │
                              └──────────┬──────────┘
                                         │
                    ┌────────────────────┴────────────────────┐
                    │                                         │
                    ▼                                         ▼
         ┌─────────────────────┐               ┌─────────────────────┐
         │    Policy-CA        │               │    Policy-CA        │
         │   (Produkcija)      │               │   (Razvoj)          │
         │   (ML-DSA-65)       │               │   (ML-DSA-65)       │
         │   15 godina         │               │   10 godina         │
         │   pathLen=1         │               │   pathLen=1         │
         │   [ONLINE/HSM]      │               │   [ONLINE]          │
         └──────────┬──────────┘               └──────────┬──────────┘
                    │                                     │
      ┌─────────────┼─────────────┐           ┌──────────┴──────────┐
      │             │             │           │                     │
      ▼             ▼             ▼           ▼                     ▼
┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐      ┌───────────┐
│ Server-CA │ │ Client-CA │ │ CodeSign  │ │ Dev-CA    │      │ Test-CA   │
│ (Prod)    │ │ (Prod)    │ │ -CA       │ │           │      │           │
│ pathLen=0 │ │ pathLen=0 │ │ pathLen=0 │ │ pathLen=0 │      │ pathLen=0 │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘      └─────┬─────┘
      │             │             │             │                  │
      ▼             ▼             ▼             ▼                  ▼
   Server        Client        Code         Dev-Certs          Test-Certs
   Certs         Certs         Signing

Karakteristike:

Model C: Cross-certifikacija (Multi-Root)

┌─────────────────────┐                    ┌─────────────────────┐
│   Root-CA (Stari)   │◄──────────────────►│   Root-CA (Novi/PQ) │
│   (RSA/ECDSA)       │  Cross-certifikat  │   (ML-DSA-87)       │
│   [Legacy]          │                    │   [Post-Quantum]    │
└──────────┬──────────┘                    └──────────┬──────────┘
           │                                          │
           ▼                                          ▼
    Legacy hijerarhija                         PQ hijerarhija

Karakteristike:


Dijagram tijeka

┌─────────────────────────────────────────────────────────────────────────────┐
│                    IZGRADNJA CA HIJERARHIJE                                 │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│ KORAK 1: Kreiranje Root-CA (Air-Gapped sustav)                              │
├─────────────────────────────────────────────────────────────────────────────┤
│  • Generiranje ML-DSA-87 para ključeva                                      │
│  • pathLength = broj planiranih razina                                      │
│  • Valjanost: 20-25 godina                                                  │
│  • Offline osiguranje ključa                                                │
└─────────────────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ KORAK 2: Planiranje CA strukture                                            │
├─────────────────────────────────────────────────────────────────────────────┤
│  • Definiranje broja i tipova Intermediate-CA                               │
│  • Definiranje konvencije imenovanja (DN struktura)                         │
│  • Definiranje Certificate Policies po tipu CA                              │
│  • Planiranje strategije opoziva (CRL/OCSP po CA)                           │
└─────────────────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ KORAK 3: Kreiranje Policy-CA (opcijski, za 3-razinsku hijerarhiju)          │
├─────────────────────────────────────────────────────────────────────────────┤
│  • Kreiranje CSR-a s pathLength=1                                           │
│  • Potpisivanje od Root-CA                                                  │
│  • Dodjela Certificate Policy OID-a                                         │
└─────────────────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ KORAK 4: Kreiranje Issuing-CA                                               │
├─────────────────────────────────────────────────────────────────────────────┤
│  Za svaki planirani Issuing-CA:                                             │
│    a) Generiranje para ključeva (ML-DSA-65)                                 │
│    b) Kreiranje CSR-a sa specifičnim ekstenzijama                           │
│    c) Potpisivanje od nadređenog CA (Root ili Policy-CA)                    │
│    d) Postavljanje EKU (Extended Key Usage) prema namjeni                   │
│    e) pathLength=0 (bez daljnje Sub-CA)                                     │
└─────────────────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ KORAK 5: Konfiguracija Trust Store-a i lanaca                               │
├─────────────────────────────────────────────────────────────────────────────┤
│  • Kreiranje Trust Store-a s Root-CA                                        │
│  • Kreiranje CA lanaca za svaki Issuing-CA                                  │
│  • Distribucija lanaca klijentima/serverima                                 │
└─────────────────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ KORAK 6: Infrastruktura opoziva                                             │
├─────────────────────────────────────────────────────────────────────────────┤
│  • Postavljanje CRL Distribution Points za svaki CA                         │
│  • Konfiguracija OCSP Respondera                                            │
│  • Objava prvih (praznih) CRL-ova                                           │
└─────────────────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ KORAK 7: Dokumentacija i politike                                           │
├─────────────────────────────────────────────────────────────────────────────┤
│  • Dokumentiranje Certificate Policy (CP)                                   │
│  • Kreiranje Certification Practice Statement (CPS)                         │
│  • Dokumentacija Key Ceremony                                               │
│  • Operativni priručnik za CA administratore                                │
└─────────────────────────────────────────────────────────────────────────────┘

Uključene funkcije

Područje FFI funkcija Opis
Ključevi wvds_sec_crypto_x509_keypair_generate_mldsa() ML-DSA ključevi za CA
DN wvds_sec_crypto_x509_dn_create() Distinguished Names
DN wvds_sec_crypto_x509_dn_add_component() Dodavanje CN, O, OU
CSR wvds_sec_crypto_x509_csr_create() Kreiranje CSR-a
CSR wvds_sec_crypto_x509_csr_sign() Potpisivanje CSR-a
Ekstenzije wvds_sec_crypto_x509_ext_set_basic_constraints() CA + pathLength
Ekstenzije wvds_sec_crypto_x509_ext_set_key_usage() keyCertSign, cRLSign
Ekstenzije wvds_sec_crypto_x509_ext_set_extended_key_usage() EKU za specijalizaciju
Ekstenzije wvds_sec_crypto_x509_ext_set_certificate_policies() Policy OID-ovi
Ekstenzije wvds_sec_crypto_x509_ext_set_name_constraints() Namespace ograničenja
Ekstenzije wvds_sec_crypto_x509_ext_set_policy_constraints() Policy zahtjevi
Certifikat wvds_sec_crypto_x509_cert_create_from_csr() Izdavanje CA certifikata
Lanac wvds_sec_crypto_x509_chain_create() Chain handle
Lanac wvds_sec_crypto_x509_chain_add_cert() Dodavanje certifikata
Trust Store wvds_sec_crypto_x509_trust_store_create() Kreiranje Trust Store-a
Validacija wvds_sec_crypto_x509_validate_chain() Validacija lanca

Primjer koda: Potpuna 2-razinska hijerarhija

C# (.NET Wrapper)

using System;
using System.IO;
using System.Collections.Generic;
using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
 
namespace CaHierarchyExample
{
    /// <summary>
    /// Kreira potpunu 2-razinsku CA hijerarhiju sa specijaliziranim Issuing-CA
    /// </summary>
    class Program
    {
        // Lozinke (u produkciji: sigurno unijeti ili iz HSM-a!)
        static readonly Dictionary<string, string> Passwords = new()
        {
            ["root"]     = "R00t#CA!V3ryStr0ng#2024",
            ["server"]   = "S3rv3r#CA!Str0ng#2024",
            ["client"]   = "Cl13nt#CA!Str0ng#2024",
            ["codesign"] = "C0d3S1gn#CA!Str0ng#2024",
            ["device"]   = "D3v1c3#CA!Str0ng#2024"
        };
 
        // Bazni URL-ovi za opoziv
        const string CRL_BASE_URL = "http://crl.datecpro.de";
        const string OCSP_URL = "http://ocsp.datecpro.de";
        const string CA_ISSUERS_URL = "http://ca.datecpro.de";
 
        static void Main(string[] args)
        {
            using var context = PqCryptoContext.Initialize();
 
            Console.WriteLine("╔══════════════════════════════════════════════════════════╗");
            Console.WriteLine("║     WvdS PQ-Crypto: Izgradnja CA hijerarhije             ║");
            Console.WriteLine("╚══════════════════════════════════════════════════════════╝\n");
 
            // ══════════════════════════════════════════════════════════════════════
            // KORAK 1: Kreiranje Root-CA
            // ══════════════════════════════════════════════════════════════════════
            Console.WriteLine("┌─────────────────────────────────────────────────────────┐");
            Console.WriteLine("│ KORAK 1: Kreiranje Root-CA                              │");
            Console.WriteLine("└─────────────────────────────────────────────────────────┘\n");
 
            var (rootCert, rootKey) = CreateRootCA(context);
 
            // ══════════════════════════════════════════════════════════════════════
            // KORAK 2: Kreiranje Issuing-CA
            // ══════════════════════════════════════════════════════════════════════
            Console.WriteLine("\n┌─────────────────────────────────────────────────────────┐");
            Console.WriteLine("│ KORAK 2: Kreiranje Issuing-CA                           │");
            Console.WriteLine("└─────────────────────────────────────────────────────────┘\n");
 
            var issuingCAs = new List<(PqCertificate cert, string name)>();
 
            // 2.1 Server-CA (za TLS server certifikate)
            var serverCA = CreateIssuingCA(context, rootCert, rootKey, new IssuingCAConfig
            {
                Name = "server",
                CommonName = "WvdS Server CA",
                OrganizationalUnit = "TLS Services",
                ExtendedKeyUsage = new[] { ExtendedKeyUsage.ServerAuth },
                ValidYears = 10
            });
            issuingCAs.Add((serverCA, "server"));
 
            // 2.2 Client-CA (za mTLS klijentske certifikate)
            var clientCA = CreateIssuingCA(context, rootCert, rootKey, new IssuingCAConfig
            {
                Name = "client",
                CommonName = "WvdS Client CA",
                OrganizationalUnit = "Client Authentication",
                ExtendedKeyUsage = new[] { ExtendedKeyUsage.ClientAuth },
                ValidYears = 10
            });
            issuingCAs.Add((clientCA, "client"));
 
            // 2.3 CodeSign-CA (za Code-Signing)
            var codeSignCA = CreateIssuingCA(context, rootCert, rootKey, new IssuingCAConfig
            {
                Name = "codesign",
                CommonName = "WvdS CodeSign CA",
                OrganizationalUnit = "Code Signing Services",
                ExtendedKeyUsage = new[] { ExtendedKeyUsage.CodeSigning },
                ValidYears = 8  // Kraće za Code-Signing
            });
            issuingCAs.Add((codeSignCA, "codesign"));
 
            // 2.4 Device-CA (za IoT/uređaje)
            var deviceCA = CreateIssuingCA(context, rootCert, rootKey, new IssuingCAConfig
            {
                Name = "device",
                CommonName = "WvdS Device CA",
                OrganizationalUnit = "IoT and Device Authentication",
                ExtendedKeyUsage = new[] { ExtendedKeyUsage.ClientAuth, ExtendedKeyUsage.ServerAuth },
                ValidYears = 10
            });
            issuingCAs.Add((deviceCA, "device"));
 
            // ══════════════════════════════════════════════════════════════════════
            // KORAK 3: Kreiranje CA lanaca
            // ══════════════════════════════════════════════════════════════════════
            Console.WriteLine("\n┌─────────────────────────────────────────────────────────┐");
            Console.WriteLine("│ KORAK 3: Kreiranje CA lanaca                            │");
            Console.WriteLine("└─────────────────────────────────────────────────────────┘\n");
 
            foreach (var (cert, name) in issuingCAs)
            {
                using var chain = context.CreateCertificateChain();
                chain.Add(cert);
                chain.Add(rootCert);
 
                string chainPath = $"{name}-ca-chain.pem";
                File.WriteAllText(chainPath, chain.ExportToPem());
                Console.WriteLine($"  ✓ {chainPath}");
            }
 
            // Potpuni lanac sa svim CA
            using var fullChain = context.CreateCertificateChain();
            foreach (var (cert, _) in issuingCAs)
                fullChain.Add(cert);
            fullChain.Add(rootCert);
 
            File.WriteAllText("full-ca-chain.pem", fullChain.ExportToPem());
            Console.WriteLine($"  ✓ full-ca-chain.pem (svi CA)");
 
            // ══════════════════════════════════════════════════════════════════════
            // KORAK 4: Kreiranje Trust Store-a
            // ══════════════════════════════════════════════════════════════════════
            Console.WriteLine("\n┌─────────────────────────────────────────────────────────┐");
            Console.WriteLine("│ KORAK 4: Kreiranje Trust Store-a                        │");
            Console.WriteLine("└─────────────────────────────────────────────────────────┘\n");
 
            using var trustStore = context.CreateTrustStore();
            trustStore.AddCertificate(rootCert);
 
            File.WriteAllText("trust-store.pem", rootCert.ExportToPem());
            Console.WriteLine("  ✓ trust-store.pem (Root-CA)");
 
            // ══════════════════════════════════════════════════════════════════════
            // KORAK 5: Validacija
            // ══════════════════════════════════════════════════════════════════════
            Console.WriteLine("\n┌─────────────────────────────────────────────────────────┐");
            Console.WriteLine("│ KORAK 5: Validacija hijerarhije                         │");
            Console.WriteLine("└─────────────────────────────────────────────────────────┘\n");
 
            foreach (var (cert, name) in issuingCAs)
            {
                // Provjera potpisa od Root
                bool sigValid = cert.VerifySignature(rootCert);
 
                // Validacija lanca
                using var testChain = context.CreateCertificateChain();
                testChain.Add(cert);
                testChain.Add(rootCert);
                var result = context.ValidateChain(testChain, trustStore);
 
                Console.WriteLine($"  {name.ToUpper()}-CA:");
                Console.WriteLine($"    Potpis:            {(sigValid ? "✓ OK" : "✗ GREŠKA")}");
                Console.WriteLine($"    Validacija lanca:  {(result.IsValid ? "✓ OK" : "✗ GREŠKA")}");
            }
 
            // ══════════════════════════════════════════════════════════════════════
            // Sažetak
            // ══════════════════════════════════════════════════════════════════════
            Console.WriteLine("\n╔══════════════════════════════════════════════════════════╗");
            Console.WriteLine("║                    SAŽETAK                               ║");
            Console.WriteLine("╠══════════════════════════════════════════════════════════╣");
            Console.WriteLine("║ Kreirani CA:                                             ║");
            Console.WriteLine("║   • Root-CA        (ML-DSA-87, 20 godina, pathLen=4)     ║");
            Console.WriteLine("║   • Server-CA      (ML-DSA-65, 10 godina, pathLen=0)     ║");
            Console.WriteLine("║   • Client-CA      (ML-DSA-65, 10 godina, pathLen=0)     ║");
            Console.WriteLine("║   • CodeSign-CA    (ML-DSA-65,  8 godina, pathLen=0)     ║");
            Console.WriteLine("║   • Device-CA      (ML-DSA-65, 10 godina, pathLen=0)     ║");
            Console.WriteLine("╠══════════════════════════════════════════════════════════╣");
            Console.WriteLine("║ Kreirane datoteke:                                       ║");
            Console.WriteLine("║   • root-ca.crt.pem / .key.pem                           ║");
            Console.WriteLine("║   • server-ca.crt.pem / .key.pem / -chain.pem            ║");
            Console.WriteLine("║   • client-ca.crt.pem / .key.pem / -chain.pem            ║");
            Console.WriteLine("║   • codesign-ca.crt.pem / .key.pem / -chain.pem          ║");
            Console.WriteLine("║   • device-ca.crt.pem / .key.pem / -chain.pem            ║");
            Console.WriteLine("║   • full-ca-chain.pem / trust-store.pem                  ║");
            Console.WriteLine("╚══════════════════════════════════════════════════════════╝");
 
            // Čišćenje
            rootCert.Dispose();
            rootKey.Dispose();
            foreach (var (cert, _) in issuingCAs)
                cert.Dispose();
        }
 
        /// <summary>
        /// Kreira Root-CA s ML-DSA-87
        /// </summary>
        static (PqCertificate cert, PqKeyPair key) CreateRootCA(PqCryptoContext context)
        {
            Console.WriteLine("Generiram Root-CA (ML-DSA-87)...");
 
            // ML-DSA-87 za najvišu sigurnost kod Root-CA
            var keyPair = context.GenerateKeyPair(PqAlgorithm.MlDsa87);
            keyPair.SelfTest();
 
            var dn = new DistinguishedNameBuilder()
                .AddCommonName("WvdS Root CA")
                .AddOrganization("DATECpro GmbH")
                .AddOrganizationalUnit("PKI Services")
                .AddCountry("DE")
                .AddLocality("München")
                .Build();
 
            var extensions = new X509ExtensionsBuilder()
                .AddBasicConstraints(isCa: true, pathLengthConstraint: 4, critical: true)
                .AddKeyUsage(KeyUsageFlags.KeyCertSign | KeyUsageFlags.CrlSign, critical: true)
                .AddSubjectKeyIdentifier(keyPair)
                .Build();
 
            var validity = new CertificateValidity(
                DateTime.UtcNow,
                DateTime.UtcNow.AddYears(20)
            );
 
            var cert = context.CreateRootCertificate(keyPair, dn, validity, extensions);
 
            // Spremanje
            File.WriteAllText("root-ca.crt.pem", cert.ExportToPem());
            File.WriteAllText("root-ca.key.pem", keyPair.ExportToEncryptedPem(Passwords["root"]));
 
            Console.WriteLine($"  Subject:    {cert.Subject}");
            Console.WriteLine($"  Serial:     {cert.SerialNumber}");
            Console.WriteLine($"  Algoritam:  ML-DSA-87");
            Console.WriteLine($"  Valjanost:  {cert.NotBefore:yyyy-MM-dd} - {cert.NotAfter:yyyy-MM-dd}");
            Console.WriteLine($"  pathLength: 4");
            Console.WriteLine($"  ✓ root-ca.crt.pem / root-ca.key.pem spremljeno");
 
            return (cert, keyPair);
        }
 
        /// <summary>
        /// Kreira Issuing-CA sa specifičnom konfiguracijom
        /// </summary>
        static PqCertificate CreateIssuingCA(
            PqCryptoContext context,
            PqCertificate issuerCert,
            PqKeyPair issuerKey,
            IssuingCAConfig config)
        {
            Console.WriteLine($"\nKreiram {config.CommonName}...");
 
            // ML-DSA-65 za Issuing-CA
            var keyPair = context.GenerateKeyPair(PqAlgorithm.MlDsa65);
            keyPair.SelfTest();
 
            var dn = new DistinguishedNameBuilder()
                .AddCommonName(config.CommonName)
                .AddOrganization("DATECpro GmbH")
                .AddOrganizationalUnit(config.OrganizationalUnit)
                .AddCountry("DE")
                .Build();
 
            // Extensions Builder
            var extBuilder = new X509ExtensionsBuilder()
                .AddBasicConstraints(isCa: true, pathLengthConstraint: 0, critical: true)
                .AddKeyUsage(KeyUsageFlags.KeyCertSign | KeyUsageFlags.CrlSign, critical: true)
                .AddSubjectKeyIdentifier(keyPair)
                .AddAuthorityKeyIdentifier(issuerCert)
                .AddCrlDistributionPoint($"{CRL_BASE_URL}/root-ca.crl")
                .AddAuthorityInfoAccess(OCSP_URL, $"{CA_ISSUERS_URL}/root-ca.crt");
 
            // Extended Key Usage (opcijski, ograničava uporabu)
            if (config.ExtendedKeyUsage?.Length > 0)
            {
                extBuilder.AddExtendedKeyUsage(config.ExtendedKeyUsage, critical: false);
            }
 
            var extensions = extBuilder.Build();
 
            var validity = new CertificateValidity(
                DateTime.UtcNow,
                DateTime.UtcNow.AddYears(config.ValidYears)
            );
 
            // Kreiranje CSR-a
            var csr = context.CreateCertificateRequest(dn, keyPair, extensions);
 
            // Potpisivanje od Root-CA
            var cert = context.IssueCertificateFromRequest(
                csr, issuerCert, issuerKey, validity, extensions
            );
 
            // Spremanje
            string baseName = config.Name;
            File.WriteAllText($"{baseName}-ca.crt.pem", cert.ExportToPem());
            File.WriteAllText($"{baseName}-ca.key.pem", keyPair.ExportToEncryptedPem(Passwords[baseName]));
 
            Console.WriteLine($"  Subject:    {cert.Subject}");
            Console.WriteLine($"  Issuer:     {cert.Issuer}");
            Console.WriteLine($"  Serial:     {cert.SerialNumber}");
            Console.WriteLine($"  Algoritam:  ML-DSA-65");
            Console.WriteLine($"  Valjanost:  {cert.NotBefore:yyyy-MM-dd} - {cert.NotAfter:yyyy-MM-dd}");
            Console.WriteLine($"  EKU:        {string.Join(", ", config.ExtendedKeyUsage ?? Array.Empty<ExtendedKeyUsage>())}");
            Console.WriteLine($"  ✓ {baseName}-ca.crt.pem / {baseName}-ca.key.pem spremljeno");
 
            // Čišćenje ključa (certifikat drži javni ključ)
            keyPair.Dispose();
            csr.Dispose();
 
            return cert;
        }
    }
 
    /// <summary>
    /// Konfiguracija za Issuing-CA
    /// </summary>
    class IssuingCAConfig
    {
        public string Name { get; set; }
        public string CommonName { get; set; }
        public string OrganizationalUnit { get; set; }
        public ExtendedKeyUsage[] ExtendedKeyUsage { get; set; }
        public int ValidYears { get; set; } = 10;
    }
}

Preporučena konfiguracija po tipu CA

Root-CA

Svojstvo Preporuka Obrazloženje
Algoritam ML-DSA-87 Najviša sigurnost za dugotrajno sidrište povjerenja
Valjanost 20-25 godina Dugotrajno, jer je promjena zahtjevna
pathLength Broj razina npr. 4 za fleksibilnost
Key Usage keyCertSign, cRLSign Samo CA operacije
Pohrana Offline/HSM Potrebna najviša zaštita

Policy-CA (opcijski)

Svojstvo Preporuka Obrazloženje
Algoritam ML-DSA-65 Dobar omjer sigurnosti i performansi
Valjanost 12-15 godina Kraće od Root
pathLength 1 Dopušta jednu razinu ispod
Certificate Policies Policy OID Definira pravila izdavanja
Pohrana Online/HSM Rijetka uporaba, visoka zaštita

Server-CA

Svojstvo Preporuka Obrazloženje
Algoritam ML-DSA-65 Ravnoteža sigurnosti i performansi
Valjanost 8-10 godina Kraća rotacija od Root
pathLength 0 Bez Sub-CA
Key Usage keyCertSign, cRLSign CA operacije
Extended Key Usage serverAuth (opcijski) Ograničenje na TLS servere
Pohrana Online (zaštićeno) Česta uporaba za izdavanje

Client-CA

Svojstvo Preporuka Obrazloženje
Algoritam ML-DSA-65 Ravnoteža sigurnosti i performansi
Valjanost 8-10 godina Standardni životni vijek
pathLength 0 Bez Sub-CA
Extended Key Usage clientAuth Samo klijentska autentifikacija
Name Constraints Opcijski DNS/Email namespace ograničenja

CodeSign-CA

Svojstvo Preporuka Obrazloženje
Algoritam ML-DSA-65 ili ML-DSA-87 Visoka sigurnost za potpisivanje koda
Valjanost 6-8 godina Preporučena kraća rotacija
pathLength 0 Bez Sub-CA
Extended Key Usage codeSigning Samo potpisivanje koda
Pohrana HSM Povećana zaštita za potpisivanje koda

Device-CA

Svojstvo Preporuka Obrazloženje
Algoritam ML-DSA-44 ili ML-DSA-65 Performanse važne za IoT
Valjanost 8-10 godina Uzeti u obzir životni vijek uređaja
pathLength 0 Bez Sub-CA
Extended Key Usage clientAuth, serverAuth Dvosmjerna komunikacija
Name Constraints Preporučeno Ograničenje na namespace uređaja

Extended Key Usage (EKU) OID-ovi

Namjena OID Tip CA
TLS Server Authentication 1.3.6.1.5.5.7.3.1 Server-CA
TLS Client Authentication 1.3.6.1.5.5.7.3.2 Client-CA, Device-CA
Code Signing 1.3.6.1.5.5.7.3.3 CodeSign-CA
Email Protection (S/MIME) 1.3.6.1.5.5.7.3.4 User-CA
Time Stamping 1.3.6.1.5.5.7.3.8 TSA-CA
OCSP Signing 1.3.6.1.5.5.7.3.9 OCSP Responder

EKU nasljeđivanje: Ako CA ima EKU, izdani certifikati smiju imati samo EKU koji su podskup CA EKU-a. Server-CA sa samo serverAuth ne može izdavati certifikate s clientAuth.


Name Constraints

Name Constraints ograničavaju namespace u kojem CA smije izdavati certifikate.

wvds_sec_crypto_x509_ext_set_name_constraints(
    ext,
    permitted_dns: ["datecpro.de", ".datecpro.de"],
    permitted_email: ["@datecpro.de"],
    excluded_dns: ["external.datecpro.de"],
    critical: true
)

Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional