====== Scenarij 2.4: Obdelava CSR ====== **Kategorija:** [[.:start|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:** - Nalaganje in razčlenjevanje CSR - Preverjanje podpisa (Proof-of-Possession) - Preverjanje skladnosti s politiko - 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(); // 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 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** | [[sl:int:pqcrypt:szenarien:zertifikate:server_cert|3.1 Strežniški certifikat]] | Izdaja certifikata | | **Predpogoj** | [[.:csr_server|2.1 Strežniški CSR]] | Ustvarjanje CSR | | **Povezano** | [[sl:int:pqcrypt:szenarien:validierung:policy_validation|5.4 Validacija politike]] | Razširjeno preverjanje politike | ---- << [[.:csr_multi_san|2.3 Multi-SAN CSR]] | [[.:start|Pregled CSR]] | [[sl:int:pqcrypt:szenarien:zertifikate:start|3. Izdaja certifikatov]] >> {{tag>scenarij csr obdelava validacija politika ca}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//