====== Szenario 2.4: CSR verarbeiten ======
**Kategorie:** [[.:start|Zertifikatsanträge (CSR)]] \\
**Komplexität:** ⭐⭐⭐ (Mittel-Hoch) \\
**Voraussetzungen:** CSR-Datei vorhanden, CA-Zugriff \\
**Geschätzte Zeit:** 10-15 Minuten
----
===== Beschreibung =====
Dieses Szenario beschreibt die **Verarbeitung eines eingereichten CSR** durch eine Certificate Authority (CA). Dies umfasst Validierung, Policy-Prüfung und Zertifikatsausstellung.
**Schritte:**
- CSR laden und parsen
- Signatur verifizieren (Proof-of-Possession)
- Policy-Konformität prüfen
- Zertifikat ausstellen
----
===== Workflow =====
flowchart TB
LOAD[CSR laden] --> PARSE[CSR parsen]
PARSE --> VERIFY[Signatur verifizieren]
VERIFY --> POLICY{Policy prüfen}
POLICY -->|OK| ISSUE[Zertifikat ausstellen]
POLICY -->|Fehler| REJECT[CSR ablehnen]
ISSUE --> RETURN[Zertifikat zurückgeben]
style VERIFY fill:#e3f2fd
style ISSUE fill:#e8f5e9
style REJECT fill:#ffcdd2
----
===== Code-Beispiel (C#) =====
using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
using var ctx = PqCryptoContext.Initialize();
// 1. CSR laden
var csrPem = File.ReadAllText("server.csr.pem");
var csr = ctx.LoadCertificateRequest(csrPem);
// 2. CSR-Informationen anzeigen
Console.WriteLine("=== CSR-Analyse ===");
Console.WriteLine($"Subject: {csr.Subject}");
Console.WriteLine($"Public Key Algorithm: {csr.PublicKeyAlgorithm}");
Console.WriteLine($"Public Key Size: {csr.PublicKeySize} Bytes");
Console.WriteLine($"Signature Algorithm: {csr.SignatureAlgorithm}");
Console.WriteLine("\nSubject Alternative Names:");
foreach (var san in csr.SubjectAlternativeNames)
{
Console.WriteLine($" - {san}");
}
Console.WriteLine("\nRequested Extensions:");
foreach (var ext in csr.RequestedExtensions)
{
Console.WriteLine($" - {ext.Oid}: {ext.FriendlyName}");
}
// 3. Signatur verifizieren (Proof-of-Possession)
bool signatureValid = csr.VerifySignature();
Console.WriteLine($"\nSignatur gültig: {signatureValid}");
if (!signatureValid)
{
throw new CryptographicException("CSR-Signatur ungültig - Abbruch");
}
// 4. Policy-Prüfung
var policyResult = ValidateCsrPolicy(csr);
if (!policyResult.IsValid)
{
Console.WriteLine($"Policy-Fehler: {policyResult.ErrorMessage}");
return;
}
// 5. Zertifikat ausstellen (siehe Szenario 3.1)
Console.WriteLine("\n✓ CSR validiert - bereit zur Zertifikatsausstellung");
----
===== Policy-Validierung =====
public class CsrPolicyValidator
{
public PolicyResult ValidateCsrPolicy(CertificateRequest csr)
{
var errors = new List();
// 1. Algorithmus prüfen
var allowedAlgorithms = new[] { "ML-DSA-44", "ML-DSA-65", "ML-DSA-87" };
if (!allowedAlgorithms.Contains(csr.PublicKeyAlgorithm))
{
errors.Add($"Algorithmus '{csr.PublicKeyAlgorithm}' nicht erlaubt");
}
// 2. Key Size prüfen
if (csr.PublicKeyAlgorithm == "ML-DSA-44")
{
errors.Add("ML-DSA-44 hat zu niedrige Sicherheit für Produktionsumgebungen");
}
// 3. Subject prüfen
if (string.IsNullOrEmpty(csr.Subject.CommonName))
{
errors.Add("Common Name (CN) ist erforderlich");
}
// 4. SANs prüfen
if (csr.SubjectAlternativeNames.Count == 0)
{
errors.Add("Mindestens ein SAN erforderlich");
}
// 5. Verbotene Domains prüfen
var forbiddenDomains = new[] { "localhost", "*.local", "*.internal" };
foreach (var san in csr.SubjectAlternativeNames)
{
if (forbiddenDomains.Any(f => san.Contains(f)))
{
errors.Add($"Verbotene Domain im SAN: {san}");
}
}
// 6. Wildcard-Regeln
var wildcardCount = csr.SubjectAlternativeNames.Count(s => s.StartsWith("*."));
if (wildcardCount > 1)
{
errors.Add("Maximal ein Wildcard-SAN erlaubt");
}
return new PolicyResult
{
IsValid = errors.Count == 0,
Errors = errors
};
}
}
----
===== Automatische CSR-Verarbeitung =====
Für automatisierte Umgebungen (ACME, EST):
public async Task ProcessCsrAutomatedAsync(
string csrPem,
string requesterIdentity,
CancellationToken ct)
{
var csr = ctx.LoadCertificateRequest(csrPem);
// 1. Signatur prüfen
if (!csr.VerifySignature())
throw new SecurityException("Ungültige CSR-Signatur");
// 2. Requester-Berechtigung prüfen
if (!await IsAuthorizedForDomains(requesterIdentity, csr.SubjectAlternativeNames, ct))
throw new UnauthorizedAccessException("Keine Berechtigung für diese Domains");
// 3. Rate Limiting
await CheckRateLimitAsync(requesterIdentity, ct);
// 4. Zertifikat ausstellen
var cert = ctx.IssueCertificate(
csr,
issuerCert: intermediateCa,
issuerKey: intermediateCaKey,
validDays: 90 // Kurze Gültigkeit für Automatisierung
);
// 5. Audit-Log
await LogCertificateIssuance(cert, requesterIdentity, ct);
return cert;
}
----
===== CSR-Formate =====
^ Format ^ Erkennung ^ Konvertierung ^
| PEM | ''-----BEGIN CERTIFICATE REQUEST-----'' | Direkt verwendbar |
| DER | Binary, kein Header | ''ctx.LoadCertificateRequestDer(bytes)'' |
| PKCS#10 | Synonym für CSR | - |
----
===== Verwandte Szenarien =====
^ Beziehung ^ Szenario ^ Beschreibung ^
| **Nächster Schritt** | [[de:int:pqcrypt:szenarien:zertifikate:server_cert|3.1 Server-Zertifikat]] | Zertifikat ausstellen |
| **Voraussetzung** | [[.:csr_server|2.1 Server-CSR]] | CSR erstellen |
| **Verwandt** | [[de:int:pqcrypt:szenarien:validierung:policy_validation|5.4 Policy-Validierung]] | Erweiterte Policy-Prüfung |
----
<< [[.:csr_multi_san|← 2.3 Multi-SAN CSR]] | [[.:start|↑ CSR-Übersicht]] | [[de:int:pqcrypt:szenarien:zertifikate:start|3. Zertifikate ausstellen →]] >>
{{tag>szenario csr verarbeitung validierung policy ca}}
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//