====== Scenario 2.4: Elaborare CSR ======
**Categoria:** [[.:start|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:**
- Caricare e parsare CSR
- Verificare firma (Proof-of-Possession)
- Verificare conformita alle policy
- 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();
// 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 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** | [[it:int:pqcrypt:szenarien:zertifikate:server_cert|3.1 Certificato server]] | Emettere certificato |
| **Prerequisito** | [[.:csr_server|2.1 CSR server]] | Creare CSR |
| **Correlato** | [[it:int:pqcrypt:szenarien:validierung:policy_validation|5.4 Validazione policy]] | Verifica policy avanzata |
----
<< [[.:csr_multi_san|← 2.3 CSR Multi-SAN]] | [[.:start|↑ Panoramica CSR]] | [[it:int:pqcrypt:szenarien:zertifikate:start|3. Emissione certificati →]] >>
{{tag>scenario csr elaborazione validazione policy ca}}
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//