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