====== Scenarij 2.4: Obrada CSR ====== **Kategorija:** [[.:start|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:** - Učitavanje i parsiranje CSR - Verifikacija potpisa (Proof-of-Possession) - Provjera usklađenosti s politikom - 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(); // 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 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** | [[hr:int:pqcrypt:szenarien:zertifikate:server_cert|3.1 Serverski certifikat]] | Izdavanje certifikata | | **Preduvjet** | [[.:csr_server|2.1 Server-CSR]] | Kreiranje CSR | | **Povezano** | [[hr:int:pqcrypt:szenarien:validierung:policy_validation|5.4 Validacija politike]] | Proširena provjera politike | ---- << [[.:csr_multi_san|← 2.3 Multi-SAN CSR]] | [[.:start|↑ Pregled CSR]] | [[hr:int:pqcrypt:szenarien:zertifikate:start|3. Izdavanje certifikata →]] >> {{tag>scenarij csr obrada validacija politika ca}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//