====== Scenarij 2.3: Kreiranje Multi-SAN CSR ======
**Kategorija:** [[.:start|Zahtjevi za certifikat (CSR)]] \\
**Složenost:** ⭐⭐⭐ (Srednje-visoka) \\
**Preduvjeti:** Par ključeva dostupan \\
**Procijenjeno vrijeme:** 10-15 minuta
----
===== Opis =====
Ovaj scenarij opisuje kreiranje CSR-a s **više Subject Alternative Names (SAN)**. Ovo je potrebno za certifikate koji trebaju osigurati više domena, poddomena ili IP adresa.
**Slučajevi uporabe:**
* Multi-domain certifikati (SAN certifikati)
* Wildcard + eksplicitne domene kombinirano
* Interna + eksterna imena
* Load balancer s više backenda
----
===== SAN tipovi =====
^ Tip ^ GeneralName Tag ^ Primjer ^ Uporaba ^
| DNS | dNSName (2) | www.example.com | Web stranice, API-ji |
| IP | iPAddress (7) | 192.168.1.100 | Interni servisi |
| Email | rfc822Name (1) | admin@example.com | S/MIME |
| URI | uniformResourceIdentifier (6) | https://example.com | SAML, OIDC |
| UPN | otherName (0) | user@domain.local | Windows Auth |
----
===== Primjer koda (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") // Primarna domena
.AddO("Example d.o.o.")
.AddC("HR")
.Build();
// Multi-SAN s različitim tipovima
var extensions = new ExtBuilder()
.SubjectAlternativeName(new[] {
// DNS imena
"dns:example.com",
"dns:www.example.com",
"dns:api.example.com",
"dns:app.example.com",
"dns:*.dev.example.com", // Wildcard za dev
// IP adrese (za interne pristupe)
"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);
// Ispis svih SAN-ova
Console.WriteLine("Subject Alternative Names:");
foreach (var san in csr.SubjectAlternativeNames)
{
Console.WriteLine($" - {san}");
}
File.WriteAllText("multi-san.csr.pem", csr.ToPem());
----
===== Kombinacija Wildcard + Explicit =====
var extensions = new ExtBuilder()
.SubjectAlternativeName(new[] {
"dns:example.com", // Root domena (wildcard ovo ne pokriva!)
"dns:*.example.com", // Sve poddomene 1. razine
"dns:*.api.example.com", // API poddomene
"dns:legacy.old-domain.com" // Alternativna domena
})
.Build();
**Važno:** Wildcards (''*.example.com'') pokrivaju samo jednu razinu i ne pokrivaju samu root domenu! Stoga uvijek navedite ''example.com'' I ''*.example.com''.
----
===== Kubernetes / Cloud-Native =====
var extensions = new ExtBuilder()
.SubjectAlternativeName(new[] {
// Kubernetes Service DNS
"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",
// Eksterna Ingress domena
"dns:api.example.com"
})
.Build();
----
===== Ograničenja i najbolje prakse =====
^ Aspekt ^ Preporuka ^ Obrazloženje ^
| Broj SAN-ova | Maks. 100 | Performanse, veličina certifikata |
| Wildcard razine | Samo 1 razina | RFC 6125 ograničenje |
| IP adrese | Samo ako je potrebno | IP-ovi se češće mijenjaju |
| Interna imena | Odvojeni certifikati | Sigurnosna separacija |
----
===== Povezani scenariji =====
^ Povezanost ^ Scenarij ^ Opis ^
| **Sljedeći korak** | [[hr:int:pqcrypt:szenarien:zertifikate:server_cert|3.1 Serverski certifikat]] | Potpisivanje CSR |
| **Alternativa** | [[hr:int:pqcrypt:szenarien:zertifikate:wildcard_cert|3.5 Wildcard certifikat]] | Samo wildcard |
| **Osnova** | [[.:csr_server|2.1 Server-CSR]] | Jednostavan serverski CSR |
----
<< [[.:csr_client|← 2.2 Klijentski CSR]] | [[.:start|↑ Pregled CSR]] | [[.:csr_verarbeiten|2.4 Obrada CSR →]] >>
{{tag>scenarij csr san multi-domain wildcard}}
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//