====== Szenario 2.3: Multi-SAN CSR erstellen ====== **Kategorie:** [[.:start|Zertifikatsanträge (CSR)]] \\ **Komplexität:** ⭐⭐⭐ (Mittel-Hoch) \\ **Voraussetzungen:** Schlüsselpaar vorhanden \\ **Geschätzte Zeit:** 10-15 Minuten ---- ===== Beschreibung ===== Dieses Szenario beschreibt die Erstellung eines CSR mit **mehreren Subject Alternative Names (SANs)**. Dies ist notwendig für Zertifikate, die mehrere Domains, Subdomains oder IP-Adressen absichern sollen. **Anwendungsfälle:** * Multi-Domain-Zertifikate (SAN-Zertifikate) * Wildcard + explizite Domains kombiniert * Interne + externe Namen * Load Balancer mit mehreren Backends ---- ===== SAN-Typen ===== ^ Typ ^ GeneralName Tag ^ Beispiel ^ Verwendung ^ | DNS | dNSName (2) | www.example.com | Websites, APIs | | IP | iPAddress (7) | 192.168.1.100 | Interne Services | | Email | rfc822Name (1) | admin@example.com | S/MIME | | URI | uniformResourceIdentifier (6) | https://example.com | SAML, OIDC | | UPN | otherName (0) | user@domain.local | Windows Auth | ---- ===== Code-Beispiel (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") // Primäre Domain .AddO("Example GmbH") .AddC("DE") .Build(); // Multi-SAN mit verschiedenen Typen var extensions = new ExtBuilder() .SubjectAlternativeName(new[] { // DNS-Namen "dns:example.com", "dns:www.example.com", "dns:api.example.com", "dns:app.example.com", "dns:*.dev.example.com", // Wildcard für Dev // IP-Adressen (für interne Zugriffe) "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); // Alle SANs ausgeben Console.WriteLine("Subject Alternative Names:"); foreach (var san in csr.SubjectAlternativeNames) { Console.WriteLine($" - {san}"); } File.WriteAllText("multi-san.csr.pem", csr.ToPem()); ---- ===== Wildcard + Explicit kombinieren ===== var extensions = new ExtBuilder() .SubjectAlternativeName(new[] { "dns:example.com", // Root-Domain (Wildcard deckt diese nicht ab!) "dns:*.example.com", // Alle Subdomains 1. Ebene "dns:*.api.example.com", // API-Subdomains "dns:legacy.old-domain.com" // Alternative Domain }) .Build(); **Wichtig:** Wildcards (''*.example.com'') decken nur eine Ebene ab und nicht die Root-Domain selbst! Daher immer ''example.com'' UND ''*.example.com'' angeben. ---- ===== 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", // Externe Ingress Domain "dns:api.example.com" }) .Build(); ---- ===== Limits und Best Practices ===== ^ Aspekt ^ Empfehlung ^ Begründung ^ | Anzahl SANs | Max. 100 | Performance, Zertifikatsgröße | | Wildcard-Ebenen | Nur 1 Ebene | RFC 6125 Einschränkung | | IP-Adressen | Nur wenn nötig | IPs ändern sich häufiger | | Interne Namen | Separate Zertifikate | Sicherheitstrennung | ---- ===== Verwandte Szenarien ===== ^ Beziehung ^ Szenario ^ Beschreibung ^ | **Nächster Schritt** | [[de:int:pqcrypt:szenarien:zertifikate:server_cert|3.1 Server-Zertifikat]] | CSR signieren | | **Alternativ** | [[de:int:pqcrypt:szenarien:zertifikate:wildcard_cert|3.5 Wildcard-Zertifikat]] | Nur Wildcard | | **Grundlage** | [[.:csr_server|2.1 Server-CSR]] | Einfacher Server-CSR | ---- << [[.:csr_client|← 2.2 Client-CSR]] | [[.:start|↑ CSR-Übersicht]] | [[.:csr_verarbeiten|2.4 CSR verarbeiten →]] >> {{tag>szenario csr san multi-domain wildcard}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//