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