Szenario 2.4: CSR verarbeiten

Kategorie: 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:

  1. CSR laden und parsen
  2. Signatur verifizieren (Proof-of-Possession)
  3. Policy-Konformität prüfen
  4. 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<string>();
 
        // 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<Certificate> 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 3.1 Server-Zertifikat Zertifikat ausstellen
Voraussetzung 2.1 Server-CSR CSR erstellen
Verwandt 5.4 Policy-Validierung Erweiterte Policy-Prüfung

« ← 2.3 Multi-SAN CSR | ↑ CSR-Übersicht | 3. Zertifikate ausstellen → »


Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional

Zuletzt geändert: den 29.01.2026 um 15:12