Inhaltsverzeichnis
Scenario 2.3: Creare CSR Multi-SAN
Categoria: 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 |
| 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 | 3.1 Certificato server | Firmare CSR |
| Alternativo | 3.5 Certificato wildcard | Solo wildcard |
| Base | 2.1 CSR server | CSR server semplice |
« ← 2.2 CSR client | ↑ Panoramica CSR | 2.4 Elaborare CSR → »
Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional
Zuletzt geändert: il 30/01/2026 alle 00:19