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