====== Scenario 1.3: Costruire gerarchia CA multilivello ====== **Categoria:** [[.:start|Infrastruttura PKI]] \\ **Complessità:** Alta \\ **Prerequisiti:** [[.:root_ca_erstellen|1.1 Root-CA]], [[.:intermediate_ca_erstellen|1.2 Intermediate-CA]] \\ **Tempo stimato:** 1-2 ore ---- ===== Descrizione ===== Questo scenario descrive la costruzione di una **gerarchia PKI multilivello** con Intermediate-CA specializzate per diversi scopi d'uso. Una gerarchia CA ben strutturata consente gestione flessibile dei certificati, controlli di sicurezza granulari e revoca semplificata. **Cosa viene creato:** * Root-CA (Offline, Trust Anchor) * Policy-CA (opzionale, per grandi organizzazioni) * Più Issuing-CA specializzate: * **Server-CA:** Certificati TLS server * **Client-CA:** Certificati mTLS client * **User-CA:** S/MIME e autenticazione utente * **CodeSign-CA:** Certificati code-signing * **Device-CA:** Certificati IoT/dispositivi **Vantaggi di una gerarchia strutturata:** * **Separazione delle responsabilità:** Team diversi gestiscono CA diverse * **Revoca granulare:** Una CA compromessa riguarda solo un'area * **Conformità:** Policy diverse per ogni scopo d'uso * **Scalabilità:** Nuove CA possono essere aggiunte facilmente * **Audit:** Chiara assegnazione dei certificati alla CA emittente ---- ===== Modelli di gerarchia ===== ==== Modello A: Gerarchia a 2 livelli (Standard) ==== ┌─────────────────────┐ │ Root-CA │ │ (ML-DSA-87) │ │ 20 anni │ │ pathLen=4 │ │ [OFFLINE] │ └──────────┬──────────┘ │ ┌────────────────────────┼────────────────────────┐ │ │ │ ▼ ▼ ▼ ┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐ │ Server-CA │ │ Client-CA │ │ CodeSign-CA │ │ (ML-DSA-65) │ │ (ML-DSA-65) │ │ (ML-DSA-65) │ │ 10 anni │ │ 10 anni │ │ 10 anni │ │ pathLen=0 │ │ pathLen=0 │ │ pathLen=0 │ │ [ONLINE] │ │ [ONLINE] │ │ [HSM] │ └──────────┬──────────┘ └──────────┬──────────┘ └──────────┬──────────┘ │ │ │ ▼ ▼ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Cert. Server │ │ Cert. Client │ │ Cert. │ │ (TLS) │ │ (mTLS) │ │ CodeSign │ └──────────────┘ └──────────────┘ └──────────────┘ **Caratteristiche:** * Semplice da gestire * Root-CA firma direttamente tutte le Issuing-CA * Adatta per organizzazioni piccole e medie ==== Modello B: Gerarchia a 3 livelli (Enterprise) ==== ┌─────────────────────┐ │ Root-CA │ │ (ML-DSA-87) │ │ 25 anni │ │ pathLen=3 │ │ [OFFLINE/HSM] │ └──────────┬──────────┘ │ ┌────────────────────┴────────────────────┐ │ │ ▼ ▼ ┌─────────────────────┐ ┌─────────────────────┐ │ Policy-CA │ │ Policy-CA │ │ (Produzione) │ │ (Sviluppo) │ │ (ML-DSA-65) │ │ (ML-DSA-65) │ │ 15 anni │ │ 10 anni │ │ 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 │ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ Cert. Cert. Code Cert.Dev Cert.Test Server Client Signing **Caratteristiche:** * Maggiore sicurezza grazie a livello aggiuntivo * Separazione tra Produzione e Sviluppo * Policy-CA possono avere Certificate Policies diverse * Adatta per grandi organizzazioni con requisiti di conformità ==== Modello C: Cross-Certificazione (Multi-Root) ==== ┌─────────────────────┐ ┌─────────────────────┐ │ Root-CA (Legacy) │◄──────────────────►│ Root-CA (Nuova/PQ)│ │ (RSA/ECDSA) │ Cross-Certificato │ (ML-DSA-87) │ │ [Legacy] │ │ [Post-Quantum] │ └──────────┬──────────┘ └──────────┬──────────┘ │ │ ▼ ▼ Gerarchia Legacy Gerarchia PQ **Caratteristiche:** * Consente migrazione da crittografia classica a PQ * Entrambe le Root-CA sono mutuamente affidabili * I client possono fidarsi di entrambe le gerarchie ---- ===== Diagramma di flusso ===== ┌─────────────────────────────────────────────────────────────────────────────┐ │ COSTRUZIONE GERARCHIA CA │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────────────┐ │ PASSO 1: Creare Root-CA (Sistema Air-Gapped) │ ├─────────────────────────────────────────────────────────────────────────────┤ │ • Generare coppia chiavi ML-DSA-87 │ │ • pathLength = Numero di livelli pianificati │ │ • Validità: 20-25 anni │ │ • Salvare chiave offline │ └─────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ PASSO 2: Pianificare struttura CA │ ├─────────────────────────────────────────────────────────────────────────────┤ │ • Definire numero e tipi di Intermediate-CA │ │ • Definire convenzione di denominazione (struttura DN) │ │ • Definire Certificate Policies per tipo CA │ │ • Pianificare strategia di revoca (CRL/OCSP per CA) │ └─────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ PASSO 3: Creare Policy-CA (opzionale, per gerarchia a 3 livelli) │ ├─────────────────────────────────────────────────────────────────────────────┤ │ • Creare CSR con pathLength=1 │ │ • Far firmare da Root-CA │ │ • Assegnare OID Certificate Policy │ └─────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ PASSO 4: Creare Issuing-CA │ ├─────────────────────────────────────────────────────────────────────────────┤ │ Per ogni Issuing-CA pianificata: │ │ a) Generare coppia chiavi (ML-DSA-65) │ │ b) Creare CSR con extensions specifiche │ │ c) Far firmare dalla CA superiore (Root o Policy-CA) │ │ d) Impostare EKU (Extended Key Usage) secondo scopo d'uso │ │ e) pathLength=0 (nessuna ulteriore Sub-CA) │ └─────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ PASSO 5: Configurare Trust Store e Chain │ ├─────────────────────────────────────────────────────────────────────────────┤ │ • Creare Trust Store con Root-CA │ │ • Creare CA-Chain per ogni Issuing-CA │ │ • Distribuire Chain a client/server │ └─────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ PASSO 6: Infrastruttura di revoca │ ├─────────────────────────────────────────────────────────────────────────────┤ │ • Configurare CRL Distribution Points per ogni CA │ │ • Configurare OCSP-Responder │ │ • Pubblicare prime CRL (vuote) │ └─────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ PASSO 7: Documentazione e Policy │ ├─────────────────────────────────────────────────────────────────────────────┤ │ • Documentare Certificate Policy (CP) │ │ • Creare Certification Practice Statement (CPS) │ │ • Documentazione Key Ceremony │ │ • Manuale operativo per amministratori CA │ └─────────────────────────────────────────────────────────────────────────────┘ ---- ===== Funzioni coinvolte ===== ^ Area ^ Funzione FFI ^ Descrizione ^ | **Chiavi** | ''wvds_sec_crypto_x509_keypair_generate_mldsa()'' | Chiavi ML-DSA per CA | | **DN** | ''wvds_sec_crypto_x509_dn_create()'' | Distinguished Names | | **DN** | ''wvds_sec_crypto_x509_dn_add_component()'' | Aggiungere CN, O, OU | | **CSR** | ''wvds_sec_crypto_x509_csr_create()'' | Creare CSR | | **CSR** | ''wvds_sec_crypto_x509_csr_sign()'' | Firmare CSR | | **Extensions** | ''wvds_sec_crypto_x509_ext_set_basic_constraints()'' | CA + pathLength | | **Extensions** | ''wvds_sec_crypto_x509_ext_set_key_usage()'' | keyCertSign, cRLSign | | **Extensions** | ''wvds_sec_crypto_x509_ext_set_extended_key_usage()'' | EKU per specializzazione | | **Extensions** | ''wvds_sec_crypto_x509_ext_set_certificate_policies()'' | OID Policy | | **Extensions** | ''wvds_sec_crypto_x509_ext_set_name_constraints()'' | Limitazioni namespace | | **Extensions** | ''wvds_sec_crypto_x509_ext_set_policy_constraints()'' | Requisiti policy | | **Certificato** | ''wvds_sec_crypto_x509_cert_create_from_csr()'' | Emettere certificato CA | | **Chain** | ''wvds_sec_crypto_x509_chain_create()'' | Handle Chain | | **Chain** | ''wvds_sec_crypto_x509_chain_add_cert()'' | Aggiungere certificato | | **Trust Store** | ''wvds_sec_crypto_x509_trust_store_create()'' | Creare Trust Store | | **Validazione** | ''wvds_sec_crypto_x509_validate_chain()'' | Validare Chain | ---- ===== Esempio codice: Gerarchia a 2 livelli completa ===== === C# (.NET Wrapper) === using System; using System.IO; using System.Collections.Generic; using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; namespace CaHierarchyExample { /// /// Crea una gerarchia CA a 2 livelli completa con Issuing-CA specializzate /// class Program { // Password (in produzione: inserire in modo sicuro o da HSM!) 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" }; // URL base per revoca 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: Costruzione gerarchia CA ║"); Console.WriteLine("╚══════════════════════════════════════════════════════════╝\n"); // ══════════════════════════════════════════════════════════════════════ // PASSO 1: Creare Root-CA // ══════════════════════════════════════════════════════════════════════ Console.WriteLine("┌─────────────────────────────────────────────────────────┐"); Console.WriteLine("│ PASSO 1: Creare Root-CA │"); Console.WriteLine("└─────────────────────────────────────────────────────────┘\n"); var (rootCert, rootKey) = CreateRootCA(context); // ══════════════════════════════════════════════════════════════════════ // PASSO 2: Creare Issuing-CA // ══════════════════════════════════════════════════════════════════════ Console.WriteLine("\n┌─────────────────────────────────────────────────────────┐"); Console.WriteLine("│ PASSO 2: Creare Issuing-CA │"); Console.WriteLine("└─────────────────────────────────────────────────────────┘\n"); var issuingCAs = new List<(PqCertificate cert, string name)>(); // 2.1 Server-CA (per certificati TLS server) 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 (per certificati mTLS client) 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 (per 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 // Più breve per Code-Signing }); issuingCAs.Add((codeSignCA, "codesign")); // 2.4 Device-CA (per IoT/Dispositivi) 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")); // ══════════════════════════════════════════════════════════════════════ // PASSO 3: Creare CA-Chain // ══════════════════════════════════════════════════════════════════════ Console.WriteLine("\n┌─────────────────────────────────────────────────────────┐"); Console.WriteLine("│ PASSO 3: Creare CA-Chain │"); 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}"); } // Chain completa con tutte le 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 (tutte le CA)"); // ══════════════════════════════════════════════════════════════════════ // PASSO 4: Creare Trust Store // ══════════════════════════════════════════════════════════════════════ Console.WriteLine("\n┌─────────────────────────────────────────────────────────┐"); Console.WriteLine("│ PASSO 4: Creare Trust Store │"); 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)"); // ══════════════════════════════════════════════════════════════════════ // PASSO 5: Validazione // ══════════════════════════════════════════════════════════════════════ Console.WriteLine("\n┌─────────────────────────────────────────────────────────┐"); Console.WriteLine("│ PASSO 5: Validare gerarchia │"); Console.WriteLine("└─────────────────────────────────────────────────────────┘\n"); foreach (var (cert, name) in issuingCAs) { // Verificare firma da Root bool sigValid = cert.VerifySignature(rootCert); // Validazione Chain using var testChain = context.CreateCertificateChain(); testChain.Add(cert); testChain.Add(rootCert); var result = context.ValidateChain(testChain, trustStore); Console.WriteLine($" {name.ToUpper()}-CA:"); Console.WriteLine($" Firma: {(sigValid ? "✓ OK" : "✗ ERRORE")}"); Console.WriteLine($" Validazione Chain: {(result.IsValid ? "✓ OK" : "✗ ERRORE")}"); } // ══════════════════════════════════════════════════════════════════════ // Riepilogo // ══════════════════════════════════════════════════════════════════════ Console.WriteLine("\n╔══════════════════════════════════════════════════════════╗"); Console.WriteLine("║ RIEPILOGO ║"); Console.WriteLine("╠══════════════════════════════════════════════════════════╣"); Console.WriteLine("║ CA create: ║"); Console.WriteLine("║ • Root-CA (ML-DSA-87, 20 anni, pathLen=4) ║"); Console.WriteLine("║ • Server-CA (ML-DSA-65, 10 anni, pathLen=0) ║"); Console.WriteLine("║ • Client-CA (ML-DSA-65, 10 anni, pathLen=0) ║"); Console.WriteLine("║ • CodeSign-CA (ML-DSA-65, 8 anni, pathLen=0) ║"); Console.WriteLine("║ • Device-CA (ML-DSA-65, 10 anni, pathLen=0) ║"); Console.WriteLine("╠══════════════════════════════════════════════════════════╣"); Console.WriteLine("║ File creati: ║"); 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("╚══════════════════════════════════════════════════════════╝"); // Cleanup rootCert.Dispose(); rootKey.Dispose(); foreach (var (cert, _) in issuingCAs) cert.Dispose(); } /// /// Crea la Root-CA con ML-DSA-87 /// static (PqCertificate cert, PqKeyPair key) CreateRootCA(PqCryptoContext context) { Console.WriteLine("Generazione Root-CA (ML-DSA-87)..."); // ML-DSA-87 per massima sicurezza nella 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); // Salvare 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($" Algoritmo: ML-DSA-87"); Console.WriteLine($" Validità: {cert.NotBefore:yyyy-MM-dd} - {cert.NotAfter:yyyy-MM-dd}"); Console.WriteLine($" pathLength: 4"); Console.WriteLine($" ✓ root-ca.crt.pem / root-ca.key.pem salvati"); return (cert, keyPair); } /// /// Crea una Issuing-CA con configurazione specifica /// static PqCertificate CreateIssuingCA( PqCryptoContext context, PqCertificate issuerCert, PqKeyPair issuerKey, IssuingCAConfig config) { Console.WriteLine($"\nCreazione {config.CommonName}..."); // ML-DSA-65 per 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 (opzionale, limita utilizzo) 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) ); // Creare CSR var csr = context.CreateCertificateRequest(dn, keyPair, extensions); // Firmare da Root-CA var cert = context.IssueCertificateFromRequest( csr, issuerCert, issuerKey, validity, extensions ); // Salvare 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($" Algoritmo: ML-DSA-65"); Console.WriteLine($" Validità: {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 salvati"); // Cleanup chiave (Certificate mantiene chiave pubblica) keyPair.Dispose(); csr.Dispose(); return cert; } } /// /// Configurazione per una 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; } } ---- ===== Configurazione raccomandata per tipo CA ===== ==== Root-CA ==== ^ Proprietà ^ Raccomandazione ^ Motivazione ^ | Algoritmo | ML-DSA-87 | Massima sicurezza per Trust Anchor longevo | | Validità | 20-25 anni | Longevo, poiché modifica è onerosa | | pathLength | Numero livelli | es. 4 per flessibilità | | Key Usage | keyCertSign, cRLSign | Solo operazioni CA | | Ubicazione | Offline/HSM | Massima protezione richiesta | ==== Policy-CA (opzionale) ==== ^ Proprietà ^ Raccomandazione ^ Motivazione ^ | Algoritmo | ML-DSA-65 | Buon rapporto sicurezza/prestazioni | | Validità | 12-15 anni | Più breve di Root | | pathLength | 1 | Consente un livello sottostante | | Certificate Policies | OID Policy | Definisce policy di emissione | | Ubicazione | Online/HSM | Uso raro, alta protezione | ==== Server-CA ==== ^ Proprietà ^ Raccomandazione ^ Motivazione ^ | Algoritmo | ML-DSA-65 | Bilanciamento sicurezza/prestazioni | | Validità | 8-10 anni | Rotazione più breve di Root | | pathLength | 0 | Nessuna Sub-CA consentita | | Key Usage | keyCertSign, cRLSign | Operazioni CA | | Extended Key Usage | serverAuth (opzionale) | Limitazione a TLS-Server | | Ubicazione | Online (protetta) | Uso frequente per emissione | ==== Client-CA ==== ^ Proprietà ^ Raccomandazione ^ Motivazione ^ | Algoritmo | ML-DSA-65 | Bilanciamento sicurezza/prestazioni | | Validità | 8-10 anni | Durata standard | | pathLength | 0 | Nessuna Sub-CA | | Extended Key Usage | clientAuth | Solo autenticazione client | | Name Constraints | Opzionale | Limitazioni namespace DNS/Email | ==== CodeSign-CA ==== ^ Proprietà ^ Raccomandazione ^ Motivazione ^ | Algoritmo | ML-DSA-65 o ML-DSA-87 | Alta sicurezza per code-signing | | Validità | 6-8 anni | Rotazione più breve raccomandata | | pathLength | 0 | Nessuna Sub-CA | | Extended Key Usage | codeSigning | Solo code-signing | | Ubicazione | HSM | Protezione elevata per code-signing | ==== Device-CA ==== ^ Proprietà ^ Raccomandazione ^ Motivazione ^ | Algoritmo | ML-DSA-44 o ML-DSA-65 | Prestazioni importanti per IoT | | Validità | 8-10 anni | Considerare durata vita dispositivi | | pathLength | 0 | Nessuna Sub-CA | | Extended Key Usage | clientAuth, serverAuth | Comunicazione bidirezionale | | Name Constraints | Raccomandato | Limitare a namespace dispositivi | ---- ===== OID Extended Key Usage (EKU) ===== ^ Scopo d'uso ^ OID ^ Tipo 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 | **Ereditarietà EKU:** Se una CA ha un EKU, i certificati emessi possono avere solo EKU che sono un sottoinsieme degli EKU della CA. Una Server-CA con solo ''serverAuth'' non può emettere certificati con ''clientAuth''. ---- ===== Name Constraints ===== Name Constraints limita il namespace in cui una CA può emettere certificati. 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>scenario pki gerarchia root-ca intermediate-ca policy-ca eku name-constraints}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//