====== Szenario 3.2: Client-Zertifikat ausstellen ====== **Kategorie:** [[.:start|Zertifikate ausstellen]] \\ **Komplexität:** ⭐⭐⭐ (Mittel-Hoch) \\ **Voraussetzungen:** CSR vorhanden, Intermediate-CA \\ **Geschätzte Zeit:** 10-15 Minuten ---- ===== Beschreibung ===== Dieses Szenario beschreibt die Ausstellung eines **Client-Zertifikats** für mTLS-Authentifizierung. Client-Zertifikate ermöglichen die starke Authentifizierung von Benutzern oder Services gegenüber Servern. **Anwendungsfälle:** * mTLS API-Zugriff * Service-to-Service Authentifizierung * VPN-Zugang * Smart Card / PIV Login ---- ===== Code-Beispiel (C#) ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using var ctx = PqCryptoContext.Initialize(); // Intermediate-CA laden var caCert = ctx.LoadCertificate("intermediate-ca.crt.pem"); var caKey = ctx.LoadPrivateKey("intermediate-ca.key.pem", "CaPassword!"); // CSR laden var csr = ctx.LoadCertificateRequest(File.ReadAllText("client.csr.pem")); csr.VerifySignature(); // Client-Zertifikat ausstellen var clientCert = ctx.IssueCertificate( csr, issuerCert: caCert, issuerKey: caKey, serialNumber: ctx.GenerateSerialNumber(), validDays: 365, extensions: new ExtBuilder() .BasicConstraints(ca: false, critical: true) // Key Usage: Nur Signatur (kein Key Encipherment für Clients) .KeyUsage(KeyUsageFlags.DigitalSignature, critical: true) // Extended Key Usage: Client Auth .ExtendedKeyUsage(ExtKeyUsage.ClientAuth) .SubjectKeyIdentifier(csr.PublicKey) .AuthorityKeyIdentifier(caCert) .CrlDistributionPoint("http://crl.example.com/intermediate.crl") .Build() ); clientCert.ToPemFile("client.crt.pem"); Console.WriteLine($"Client-Zertifikat ausgestellt: {clientCert.Subject}"); ---- ===== Service-Account Zertifikat ===== Für Microservices und automatisierte Systeme: // Service-Zertifikat mit Service-Account-Namen var serviceCert = ctx.IssueCertificate( csr, issuerCert: caCert, issuerKey: caKey, validDays: 90, // Kurze Gültigkeit für automatische Rotation extensions: new ExtBuilder() .BasicConstraints(ca: false) .KeyUsage(KeyUsageFlags.DigitalSignature) .ExtendedKeyUsage(ExtKeyUsage.ClientAuth) // Service-spezifische SANs .SubjectAlternativeName(new[] { "dns:payment-service.internal", "uri:spiffe://cluster.local/ns/default/sa/payment-service" }) .Build() ); ---- ===== Unterschied zu Server-Zertifikat ===== ^ Aspekt ^ Server-Zertifikat ^ Client-Zertifikat ^ | Extended Key Usage | serverAuth | clientAuth | | Key Usage | digitalSignature + keyEncipherment | digitalSignature | | Subject | DNS-Name | Benutzer/Service-Name | | SAN Typen | DNS, IP | Email, UPN, DNS | | Gültigkeit | 1-2 Jahre | 90 Tage - 1 Jahr | ---- ===== PFX für Windows/Browser ===== // PFX erstellen für Import in Browser/Windows var pfxData = ctx.ExportToPfx( certificate: clientCert, privateKey: clientKey, chain: new[] { caCert }, password: "UserPassword123!", friendlyName: "Max Mustermann - Client Cert" ); File.WriteAllBytes("client.pfx", pfxData); ---- ===== Verwandte Szenarien ===== ^ Beziehung ^ Szenario ^ Beschreibung ^ | **Voraussetzung** | [[de:int:pqcrypt:szenarien:csr:csr_client|2.2 Client-CSR]] | CSR erstellen | | **Nächster Schritt** | [[de:int:pqcrypt:szenarien:authentifizierung:mtls_client_auth|9.1 mTLS Client-Auth]] | Zertifikat verwenden | | **Verwandt** | [[.:server_cert|3.1 Server-Zertifikat]] | Gegenstück | ---- << [[.:server_cert|← 3.1 Server-Zertifikat]] | [[.:start|↑ Zertifikate-Übersicht]] | [[.:codesign_cert|3.3 Code-Signing →]] >> {{tag>szenario zertifikat client mtls authentifizierung}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//