Scenarij 2.4: Obrada CSR

Kategorija: Zahtjevi za certifikat (CSR)
Složenost: ⭐⭐⭐ (Srednje-visoka)
Preduvjeti: CSR datoteka dostupna, CA pristup
Procijenjeno vrijeme: 10-15 minuta


Opis

Ovaj scenarij opisuje obradu podnesenog CSR od strane Certificate Authority (CA). To uključuje validaciju, provjeru politike i izdavanje certifikata.

Koraci:

  1. Učitavanje i parsiranje CSR
  2. Verifikacija potpisa (Proof-of-Possession)
  3. Provjera usklađenosti s politikom
  4. Izdavanje certifikata

Tijek rada

flowchart TB LOAD[Učitavanje CSR] --> PARSE[Parsiranje CSR] PARSE --> VERIFY[Verifikacija potpisa] VERIFY --> POLICY{Provjera politike} POLICY -->|OK| ISSUE[Izdavanje certifikata] POLICY -->|Greška| REJECT[Odbijanje CSR] ISSUE --> RETURN[Vraćanje certifikata] style VERIFY fill:#e3f2fd style ISSUE fill:#e8f5e9 style REJECT fill:#ffcdd2


Primjer koda (C#)

using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
 
using var ctx = PqCryptoContext.Initialize();
 
// 1. Učitavanje CSR
var csrPem = File.ReadAllText("server.csr.pem");
var csr = ctx.LoadCertificateRequest(csrPem);
 
// 2. Prikaz CSR informacija
Console.WriteLine("=== CSR analiza ===");
Console.WriteLine($"Subject: {csr.Subject}");
Console.WriteLine($"Algoritam javnog ključa: {csr.PublicKeyAlgorithm}");
Console.WriteLine($"Veličina javnog ključa: {csr.PublicKeySize} bajtova");
Console.WriteLine($"Algoritam potpisa: {csr.SignatureAlgorithm}");
 
Console.WriteLine("\nSubject Alternative Names:");
foreach (var san in csr.SubjectAlternativeNames)
{
    Console.WriteLine($"  - {san}");
}
 
Console.WriteLine("\nZatražene ekstenzije:");
foreach (var ext in csr.RequestedExtensions)
{
    Console.WriteLine($"  - {ext.Oid}: {ext.FriendlyName}");
}
 
// 3. Verifikacija potpisa (Proof-of-Possession)
bool signatureValid = csr.VerifySignature();
Console.WriteLine($"\nPotpis valjan: {signatureValid}");
 
if (!signatureValid)
{
    throw new CryptographicException("CSR potpis nije valjan - prekid");
}
 
// 4. Provjera politike
var policyResult = ValidateCsrPolicy(csr);
if (!policyResult.IsValid)
{
    Console.WriteLine($"Greška politike: {policyResult.ErrorMessage}");
    return;
}
 
// 5. Izdavanje certifikata (vidi Scenarij 3.1)
Console.WriteLine("\n✓ CSR validiran - spreman za izdavanje certifikata");

Validacija politike

public class CsrPolicyValidator
{
    public PolicyResult ValidateCsrPolicy(CertificateRequest csr)
    {
        var errors = new List<string>();
 
        // 1. Provjera algoritma
        var allowedAlgorithms = new[] { "ML-DSA-44", "ML-DSA-65", "ML-DSA-87" };
        if (!allowedAlgorithms.Contains(csr.PublicKeyAlgorithm))
        {
            errors.Add($"Algoritam '{csr.PublicKeyAlgorithm}' nije dozvoljen");
        }
 
        // 2. Provjera veličine ključa
        if (csr.PublicKeyAlgorithm == "ML-DSA-44")
        {
            errors.Add("ML-DSA-44 ima prenisku sigurnost za produkcijska okruženja");
        }
 
        // 3. Provjera Subject
        if (string.IsNullOrEmpty(csr.Subject.CommonName))
        {
            errors.Add("Common Name (CN) je obavezan");
        }
 
        // 4. Provjera SAN-ova
        if (csr.SubjectAlternativeNames.Count == 0)
        {
            errors.Add("Potreban je barem jedan SAN");
        }
 
        // 5. Provjera zabranjenih domena
        var forbiddenDomains = new[] { "localhost", "*.local", "*.internal" };
        foreach (var san in csr.SubjectAlternativeNames)
        {
            if (forbiddenDomains.Any(f => san.Contains(f)))
            {
                errors.Add($"Zabranjena domena u SAN: {san}");
            }
        }
 
        // 6. Wildcard pravila
        var wildcardCount = csr.SubjectAlternativeNames.Count(s => s.StartsWith("*."));
        if (wildcardCount > 1)
        {
            errors.Add("Dozvoljen je maksimalno jedan wildcard SAN");
        }
 
        return new PolicyResult
        {
            IsValid = errors.Count == 0,
            Errors = errors
        };
    }
}

Automatska obrada CSR

Za automatizirana okruženja (ACME, EST):

public async Task<Certificate> ProcessCsrAutomatedAsync(
    string csrPem,
    string requesterIdentity,
    CancellationToken ct)
{
    var csr = ctx.LoadCertificateRequest(csrPem);
 
    // 1. Provjera potpisa
    if (!csr.VerifySignature())
        throw new SecurityException("Nevaljani CSR potpis");
 
    // 2. Provjera ovlaštenja podnositelja
    if (!await IsAuthorizedForDomains(requesterIdentity, csr.SubjectAlternativeNames, ct))
        throw new UnauthorizedAccessException("Nema ovlaštenja za ove domene");
 
    // 3. Ograničenje brzine
    await CheckRateLimitAsync(requesterIdentity, ct);
 
    // 4. Izdavanje certifikata
    var cert = ctx.IssueCertificate(
        csr,
        issuerCert: intermediateCa,
        issuerKey: intermediateCaKey,
        validDays: 90  // Kratka valjanost za automatizaciju
    );
 
    // 5. Audit log
    await LogCertificateIssuance(cert, requesterIdentity, ct);
 
    return cert;
}

CSR formati

Format Prepoznavanje Konverzija
PEM —–BEGIN CERTIFICATE REQUEST—– Direktno upotrebljivo
DER Binarno, bez zaglavlja ctx.LoadCertificateRequestDer(bytes)
PKCS#10 Sinonim za CSR -

Povezani scenariji

Povezanost Scenarij Opis
Sljedeći korak 3.1 Serverski certifikat Izdavanje certifikata
Preduvjet 2.1 Server-CSR Kreiranje CSR
Povezano 5.4 Validacija politike Proširena provjera politike

« ← 2.3 Multi-SAN CSR | ↑ Pregled CSR | 3. Izdavanje certifikata → »


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

Zuletzt geändert: 30.01.2026. u 00:20