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