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