====== Scenarij 1.3: Izgradnja višerazinske CA hijerarhije ====== **Kategorija:** [[.:start|PKI infrastruktura]] \\ **Složenost:** ⭐⭐⭐⭐ (Visoka) \\ **Preduvjeti:** [[.:root_ca_erstellen|1.1 Root-CA]], [[.:intermediate_ca_erstellen|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:** * Root-CA (Offline, sidrište povjerenja) * Policy-CA (opcijski, za velike organizacije) * Više specijaliziranih Issuing-CA: * **Server-CA:** TLS server certifikati * **Client-CA:** mTLS klijentski certifikati * **User-CA:** S/MIME i korisnička autentifikacija * **CodeSign-CA:** Code-Signing certifikati * **Device-CA:** IoT/uređajni certifikati **Prednosti strukturirane hijerarhije:** * **Razdvajanje odgovornosti:** Različiti timovi upravljaju različitim CA-ovima * **Granularni opoziv:** Kompromitiran CA utječe samo na jedno područje * **Usklađenost:** Različite politike po namjeni * **Skalabilnost:** Novi CA-ovi se mogu jednostavno dodati * **Revizija:** Jasna dodjela certifikata izdavajućem CA ---- ===== 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:** * Jednostavno upravljanje * Root-CA izravno potpisuje sve Issuing-CA * Pogodno za male do srednje organizacije ==== 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:** * Viša sigurnost kroz dodatnu razinu * Razdvajanje produkcije i razvoja * Policy-CA mogu imati različite Certificate Policies * Pogodno za velike organizacije s compliance zahtjevima ==== 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:** * Omogućuje migraciju s klasične na PQ kriptografiju * Oba Root-CA su međusobno pouzdana * Klijenti mogu vjerovati objema hijerarhijama ---- ===== 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 { /// /// Kreira potpunu 2-razinsku CA hijerarhiju sa specijaliziranim Issuing-CA /// class Program { // Lozinke (u produkciji: sigurno unijeti ili iz HSM-a!) static readonly Dictionary 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(); } /// /// Kreira Root-CA s ML-DSA-87 /// 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); } /// /// Kreira Issuing-CA sa specifičnom konfiguracijom /// 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())}"); 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; } } /// /// Konfiguracija za Issuing-CA /// 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 ) {{tag>scenarij pki hijerarhija root-ca intermediate-ca policy-ca eku name-constraints}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//