Inhaltsverzeichnis

Scenarij 2.4: Obdelava CSR

Kategorija: Zahteve za certifikate (CSR)
Kompleksnost: 3/5 (Srednje-visoka)
Predpogoji: CSR-datoteka na voljo, dostop do CA
Ocenjeni čas: 10-15 minut


Opis

Ta scenarij opisuje obdelavo predloženega CSR s strani Certificate Authority (CA). To vključuje validacijo, preverjanje politike in izdajo certifikata.

Koraki:

  1. Nalaganje in razčlenjevanje CSR
  2. Preverjanje podpisa (Proof-of-Possession)
  3. Preverjanje skladnosti s politiko
  4. Izdaja certifikata

Potek dela

flowchart TB LOAD[Nalaganje CSR] --> PARSE[Razčlenjevanje CSR] PARSE --> VERIFY[Preverjanje podpisa] VERIFY --> POLICY{Preverjanje politike} POLICY -->|OK| ISSUE[Izdaja certifikata] POLICY -->|Napaka| REJECT[Zavrnitev CSR] ISSUE --> RETURN[Vračilo certifikata] style VERIFY fill:#e3f2fd style ISSUE fill:#e8f5e9 style REJECT fill:#ffcdd2


Primer kode (C#)

using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
 
using var ctx = PqCryptoContext.Initialize();
 
// 1. Nalaganje CSR
var csrPem = File.ReadAllText("server.csr.pem");
var csr = ctx.LoadCertificateRequest(csrPem);
 
// 2. Prikaz informacij CSR
Console.WriteLine("=== Analiza CSR ===");
Console.WriteLine($"Subject: {csr.Subject}");
Console.WriteLine($"Algoritem javnega ključa: {csr.PublicKeyAlgorithm}");
Console.WriteLine($"Velikost javnega ključa: {csr.PublicKeySize} bajtov");
Console.WriteLine($"Algoritem podpisa: {csr.SignatureAlgorithm}");
 
Console.WriteLine("\nSubject Alternative Names:");
foreach (var san in csr.SubjectAlternativeNames)
{
    Console.WriteLine($"  - {san}");
}
 
Console.WriteLine("\nZahtevane razširitve:");
foreach (var ext in csr.RequestedExtensions)
{
    Console.WriteLine($"  - {ext.Oid}: {ext.FriendlyName}");
}
 
// 3. Preverjanje podpisa (Proof-of-Possession)
bool signatureValid = csr.VerifySignature();
Console.WriteLine($"\nPodpis veljaven: {signatureValid}");
 
if (!signatureValid)
{
    throw new CryptographicException("Podpis CSR neveljaven - prekinitev");
}
 
// 4. Preverjanje politike
var policyResult = ValidateCsrPolicy(csr);
if (!policyResult.IsValid)
{
    Console.WriteLine($"Napaka politike: {policyResult.ErrorMessage}");
    return;
}
 
// 5. Izdaja certifikata (glejte scenarij 3.1)
Console.WriteLine("\n Certifikat CSR validiran - pripravljen za izdajo certifikata");

Validacija politike

public class CsrPolicyValidator
{
    public PolicyResult ValidateCsrPolicy(CertificateRequest csr)
    {
        var errors = new List<string>();
 
        // 1. Preverjanje algoritma
        var allowedAlgorithms = new[] { "ML-DSA-44", "ML-DSA-65", "ML-DSA-87" };
        if (!allowedAlgorithms.Contains(csr.PublicKeyAlgorithm))
        {
            errors.Add($"Algoritem '{csr.PublicKeyAlgorithm}' ni dovoljen");
        }
 
        // 2. Preverjanje velikosti ključa
        if (csr.PublicKeyAlgorithm == "ML-DSA-44")
        {
            errors.Add("ML-DSA-44 ima prenizko varnost za produkcijska okolja");
        }
 
        // 3. Preverjanje Subject
        if (string.IsNullOrEmpty(csr.Subject.CommonName))
        {
            errors.Add("Common Name (CN) je obvezen");
        }
 
        // 4. Preverjanje SAN-ov
        if (csr.SubjectAlternativeNames.Count == 0)
        {
            errors.Add("Obvezen je vsaj en SAN");
        }
 
        // 5. Preverjanje prepovedanih domen
        var forbiddenDomains = new[] { "localhost", "*.local", "*.internal" };
        foreach (var san in csr.SubjectAlternativeNames)
        {
            if (forbiddenDomains.Any(f => san.Contains(f)))
            {
                errors.Add($"Prepovedana domena v SAN: {san}");
            }
        }
 
        // 6. Pravila za wildcard
        var wildcardCount = csr.SubjectAlternativeNames.Count(s => s.StartsWith("*."));
        if (wildcardCount > 1)
        {
            errors.Add("Dovoljen je največ en wildcard-SAN");
        }
 
        return new PolicyResult
        {
            IsValid = errors.Count == 0,
            Errors = errors
        };
    }
}

Avtomatska obdelava CSR

Za avtomatizirana okolja (ACME, EST):

public async Task<Certificate> ProcessCsrAutomatedAsync(
    string csrPem,
    string requesterIdentity,
    CancellationToken ct)
{
    var csr = ctx.LoadCertificateRequest(csrPem);
 
    // 1. Preverjanje podpisa
    if (!csr.VerifySignature())
        throw new SecurityException("Neveljaven podpis CSR");
 
    // 2. Preverjanje pooblastila vlagatelja
    if (!await IsAuthorizedForDomains(requesterIdentity, csr.SubjectAlternativeNames, ct))
        throw new UnauthorizedAccessException("Brez pooblastila za te domene");
 
    // 3. Rate Limiting
    await CheckRateLimitAsync(requesterIdentity, ct);
 
    // 4. Izdaja certifikata
    var cert = ctx.IssueCertificate(
        csr,
        issuerCert: intermediateCa,
        issuerKey: intermediateCaKey,
        validDays: 90  // Kratka veljavnost za avtomatizacijo
    );
 
    // 5. Revizijski dnevnik
    await LogCertificateIssuance(cert, requesterIdentity, ct);
 
    return cert;
}

Formati CSR

Format Prepoznavanje Pretvorba
PEM —–BEGIN CERTIFICATE REQUEST—– Neposredno uporabno
DER Binarno, brez glave ctx.LoadCertificateRequestDer(bytes)
PKCS#10 Sinonim za CSR -

Povezani scenariji

Povezava Scenarij Opis
Naslednji korak 3.1 Strežniški certifikat Izdaja certifikata
Predpogoj 2.1 Strežniški CSR Ustvarjanje CSR
Povezano 5.4 Validacija politike Razširjeno preverjanje politike

« 2.3 Multi-SAN CSR | Pregled CSR | 3. Izdaja certifikatov »


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