====== 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//