====== 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//