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:


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