Inhaltsverzeichnis

Scenario 2.4: Elaborare CSR

Categoria: Richieste di certificato (CSR)
Complessita: ⭐⭐⭐ (Medio-Alta)
Prerequisiti: File CSR disponibile, accesso CA
Tempo stimato: 10-15 minuti


Descrizione

Questo scenario descrive l'elaborazione di un CSR inviato da parte di una Certificate Authority (CA). Questo include validazione, verifica delle policy e emissione del certificato.

Passaggi:

  1. Caricare e parsare CSR
  2. Verificare firma (Proof-of-Possession)
  3. Verificare conformita alle policy
  4. Emettere certificato

Workflow

flowchart TB LOAD[Caricare CSR] --> PARSE[Parsare CSR] PARSE --> VERIFY[Verificare firma] VERIFY --> POLICY{Verificare policy} POLICY -->|OK| ISSUE[Emettere certificato] POLICY -->|Errore| REJECT[Rifiutare CSR] ISSUE --> RETURN[Restituire certificato] style VERIFY fill:#e3f2fd style ISSUE fill:#e8f5e9 style REJECT fill:#ffcdd2


Esempio di codice (C#)

using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
 
using var ctx = PqCryptoContext.Initialize();
 
// 1. Caricare CSR
var csrPem = File.ReadAllText("server.csr.pem");
var csr = ctx.LoadCertificateRequest(csrPem);
 
// 2. Visualizzare informazioni CSR
Console.WriteLine("=== Analisi CSR ===");
Console.WriteLine($"Subject: {csr.Subject}");
Console.WriteLine($"Algoritmo chiave pubblica: {csr.PublicKeyAlgorithm}");
Console.WriteLine($"Dimensione chiave pubblica: {csr.PublicKeySize} Bytes");
Console.WriteLine($"Algoritmo firma: {csr.SignatureAlgorithm}");
 
Console.WriteLine("\nSubject Alternative Names:");
foreach (var san in csr.SubjectAlternativeNames)
{
    Console.WriteLine($"  - {san}");
}
 
Console.WriteLine("\nExtensions richieste:");
foreach (var ext in csr.RequestedExtensions)
{
    Console.WriteLine($"  - {ext.Oid}: {ext.FriendlyName}");
}
 
// 3. Verificare firma (Proof-of-Possession)
bool signatureValid = csr.VerifySignature();
Console.WriteLine($"\nFirma valida: {signatureValid}");
 
if (!signatureValid)
{
    throw new CryptographicException("Firma CSR non valida - Interruzione");
}
 
// 4. Verifica policy
var policyResult = ValidateCsrPolicy(csr);
if (!policyResult.IsValid)
{
    Console.WriteLine($"Errore policy: {policyResult.ErrorMessage}");
    return;
}
 
// 5. Emettere certificato (vedi Scenario 3.1)
Console.WriteLine("\n✓ CSR validato - pronto per emissione certificato");

Validazione policy

public class CsrPolicyValidator
{
    public PolicyResult ValidateCsrPolicy(CertificateRequest csr)
    {
        var errors = new List<string>();
 
        // 1. Verificare algoritmo
        var allowedAlgorithms = new[] { "ML-DSA-44", "ML-DSA-65", "ML-DSA-87" };
        if (!allowedAlgorithms.Contains(csr.PublicKeyAlgorithm))
        {
            errors.Add($"Algoritmo '{csr.PublicKeyAlgorithm}' non consentito");
        }
 
        // 2. Verificare dimensione chiave
        if (csr.PublicKeyAlgorithm == "ML-DSA-44")
        {
            errors.Add("ML-DSA-44 ha sicurezza troppo bassa per ambienti di produzione");
        }
 
        // 3. Verificare Subject
        if (string.IsNullOrEmpty(csr.Subject.CommonName))
        {
            errors.Add("Common Name (CN) e richiesto");
        }
 
        // 4. Verificare SAN
        if (csr.SubjectAlternativeNames.Count == 0)
        {
            errors.Add("Richiesto almeno un SAN");
        }
 
        // 5. Verificare domini vietati
        var forbiddenDomains = new[] { "localhost", "*.local", "*.internal" };
        foreach (var san in csr.SubjectAlternativeNames)
        {
            if (forbiddenDomains.Any(f => san.Contains(f)))
            {
                errors.Add($"Dominio vietato nel SAN: {san}");
            }
        }
 
        // 6. Regole wildcard
        var wildcardCount = csr.SubjectAlternativeNames.Count(s => s.StartsWith("*."));
        if (wildcardCount > 1)
        {
            errors.Add("Consentito massimo un SAN wildcard");
        }
 
        return new PolicyResult
        {
            IsValid = errors.Count == 0,
            Errors = errors
        };
    }
}

Elaborazione automatica CSR

Per ambienti automatizzati (ACME, EST):

public async Task<Certificate> ProcessCsrAutomatedAsync(
    string csrPem,
    string requesterIdentity,
    CancellationToken ct)
{
    var csr = ctx.LoadCertificateRequest(csrPem);
 
    // 1. Verificare firma
    if (!csr.VerifySignature())
        throw new SecurityException("Firma CSR non valida");
 
    // 2. Verificare autorizzazione richiedente
    if (!await IsAuthorizedForDomains(requesterIdentity, csr.SubjectAlternativeNames, ct))
        throw new UnauthorizedAccessException("Nessuna autorizzazione per questi domini");
 
    // 3. Rate Limiting
    await CheckRateLimitAsync(requesterIdentity, ct);
 
    // 4. Emettere certificato
    var cert = ctx.IssueCertificate(
        csr,
        issuerCert: intermediateCa,
        issuerKey: intermediateCaKey,
        validDays: 90  // Validita breve per automazione
    );
 
    // 5. Audit-Log
    await LogCertificateIssuance(cert, requesterIdentity, ct);
 
    return cert;
}

Formati CSR

Formato Riconoscimento Conversione
PEM —–BEGIN CERTIFICATE REQUEST—– Utilizzabile direttamente
DER Binario, senza header ctx.LoadCertificateRequestDer(bytes)
PKCS#10 Sinonimo di CSR -

Scenari correlati

Relazione Scenario Descrizione
Passo successivo 3.1 Certificato server Emettere certificato
Prerequisito 2.1 CSR server Creare CSR
Correlato 5.4 Validazione policy Verifica policy avanzata

« ← 2.3 CSR Multi-SAN | ↑ Panoramica CSR | 3. Emissione certificati → »


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