====== Scenario 2.3: Creare CSR Multi-SAN ====== **Categoria:** [[.:start|Richieste di certificato (CSR)]] \\ **Complessita:** ⭐⭐⭐ (Medio-Alta) \\ **Prerequisiti:** Coppia di chiavi disponibile \\ **Tempo stimato:** 10-15 minuti ---- ===== Descrizione ===== Questo scenario descrive la creazione di un CSR con **piu Subject Alternative Names (SAN)**. Questo e necessario per certificati che devono proteggere piu domini, sottodomini o indirizzi IP. **Casi d'uso:** * Certificati multi-dominio (certificati SAN) * Wildcard + domini espliciti combinati * Nomi interni + esterni * Load Balancer con piu backend ---- ===== Tipi SAN ===== ^ Tipo ^ Tag GeneralName ^ Esempio ^ Utilizzo ^ | DNS | dNSName (2) | www.example.com | Siti web, API | | IP | iPAddress (7) | 192.168.1.100 | Servizi interni | | Email | rfc822Name (1) | admin@example.com | S/MIME | | URI | uniformResourceIdentifier (6) | https://example.com | SAML, OIDC | | UPN | otherName (0) | user@domain.local | Windows Auth | ---- ===== Esempio di codice (C#) ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using var ctx = PqCryptoContext.Initialize(); using var key = ctx.GenerateKeyPair(PqAlgorithm.MlDsa65); var dn = new DnBuilder() .AddCN("example.com") // Dominio primario .AddO("Example SRL") .AddC("IT") .Build(); // Multi-SAN con diversi tipi var extensions = new ExtBuilder() .SubjectAlternativeName(new[] { // Nomi DNS "dns:example.com", "dns:www.example.com", "dns:api.example.com", "dns:app.example.com", "dns:*.dev.example.com", // Wildcard per Dev // Indirizzi IP (per accessi interni) "ip:10.0.0.100", "ip:192.168.1.50", // IPv6 "ip:2001:db8::1" }) .KeyUsage(KeyUsageFlags.DigitalSignature | KeyUsageFlags.KeyEncipherment) .ExtendedKeyUsage(ExtKeyUsage.ServerAuth) .Build(); var csr = ctx.CreateCertificateRequest(key, dn, extensions); // Visualizzare tutti i SAN Console.WriteLine("Subject Alternative Names:"); foreach (var san in csr.SubjectAlternativeNames) { Console.WriteLine($" - {san}"); } File.WriteAllText("multi-san.csr.pem", csr.ToPem()); ---- ===== Combinare Wildcard + Espliciti ===== var extensions = new ExtBuilder() .SubjectAlternativeName(new[] { "dns:example.com", // Dominio root (Wildcard non lo copre!) "dns:*.example.com", // Tutti i sottodomini 1o livello "dns:*.api.example.com", // Sottodomini API "dns:legacy.old-domain.com" // Dominio alternativo }) .Build(); **Importante:** I Wildcard (''*.example.com'') coprono solo un livello e non il dominio root stesso! Quindi specificare sempre ''example.com'' E ''*.example.com''. ---- ===== Kubernetes / Cloud-Native ===== var extensions = new ExtBuilder() .SubjectAlternativeName(new[] { // DNS Kubernetes Service "dns:my-service", "dns:my-service.default", "dns:my-service.default.svc", "dns:my-service.default.svc.cluster.local", // Headless Service (Pod DNS) "dns:*.my-service.default.svc.cluster.local", // Dominio Ingress esterno "dns:api.example.com" }) .Build(); ---- ===== Limiti e Best Practice ===== ^ Aspetto ^ Raccomandazione ^ Motivazione ^ | Numero SAN | Max. 100 | Performance, dimensione certificato | | Livelli wildcard | Solo 1 livello | Restrizione RFC 6125 | | Indirizzi IP | Solo se necessario | Gli IP cambiano piu frequentemente | | Nomi interni | Certificati separati | Separazione sicurezza | ---- ===== Scenari correlati ===== ^ Relazione ^ Scenario ^ Descrizione ^ | **Passo successivo** | [[it:int:pqcrypt:szenarien:zertifikate:server_cert|3.1 Certificato server]] | Firmare CSR | | **Alternativo** | [[it:int:pqcrypt:szenarien:zertifikate:wildcard_cert|3.5 Certificato wildcard]] | Solo wildcard | | **Base** | [[.:csr_server|2.1 CSR server]] | CSR server semplice | ---- << [[.:csr_client|← 2.2 CSR client]] | [[.:start|↑ Panoramica CSR]] | [[.:csr_verarbeiten|2.4 Elaborare CSR →]] >> {{tag>scenario csr san multi-dominio wildcard}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//