~~NOTOC~~ ====== Scenarij 5.2: Validacija verige ====== **Kategorija:** [[.:start|Validacija in zaupanje]] \\ **Kompleksnost:** ⭐⭐⭐⭐ (Visoka) \\ **Predpogoji:** Zgrajena veriga certifikatov \\ **Predviden čas:** 15-20 minut ---- ===== Opis ===== Ta scenarij opisuje **popolno validacijo verige certifikatov** po RFC 5280. Validacija preverja: * **Veljavnost podpisa** - Vsak certifikat podpisan od izdajatelja * **Časovno veljavnost** - Vsi certifikati znotraj obdobja veljavnosti * **Key Usage** - Dovoljeni nameni uporabe * **Path Length** - BasicConstraints pathLenConstraint * **Policy Constraints** - Omejitve politik certifikatov * **Name Constraints** - Dovoljena/prepovedana imena ---- ===== Potek dela ===== flowchart TD BUILD[Gradnja verige] --> SIG[Preverjanje podpisa] SIG --> TIME[Časovna veljavnost] TIME --> KU[Key Usage] KU --> PATH[Path Length] PATH --> POLICY[Policy Constraints] POLICY --> NAME[Name Constraints] NAME --> REV[Preverjanje preklica] REV --> OK{Vse v redu?} OK -->|Da| VALID[Certifikat veljaven] OK -->|Ne| INVALID[Certifikat neveljaven] style VALID fill:#e8f5e9 style INVALID fill:#ffebee ---- ===== Primer kode (C#) ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using System.Security.Cryptography.X509Certificates; using var ctx = PqCryptoContext.Initialize(); // Nalaganje certifikata var serverCert = ctx.LoadCertificate("server.crt.pem"); // Popolna validacija verige var chain = new X509Chain(); chain.ChainPolicy.RevocationMode = X509RevocationMode.Online; chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain; chain.ChainPolicy.UrlRetrievalTimeout = TimeSpan.FromSeconds(30); chain.ChainPolicy.VerificationTime = DateTime.UtcNow; // Dodatni vmesni certifikati chain.ChainPolicy.ExtraStore.Add(ctx.LoadCertificate("intermediate-ca.crt.pem")); // Gradnja in validacija verige bool isValid = chain.Build(serverCert); // Ovrednotenje rezultata Console.WriteLine($"Validacija verige: {(isValid ? "VELJAVNA" : "NEVELJAVNA")}"); if (!isValid) { foreach (var element in chain.ChainElements) { foreach (var status in element.ChainElementStatus) { Console.WriteLine($" {element.Certificate.Subject}"); Console.WriteLine($" Napaka: {status.Status}"); Console.WriteLine($" Podrobnosti: {status.StatusInformation}"); } } } ---- ===== Podrobna validacija ===== public class ChainValidator { public ValidationResult ValidateChain(X509Certificate2 certificate, ValidationOptions options) { var result = new ValidationResult { IsValid = true }; using var chain = new X509Chain(); ConfigureChainPolicy(chain.ChainPolicy, options); if (!chain.Build(certificate)) { result.IsValid = false; result.Errors = ExtractErrors(chain); } // Dodatna PQ preverjanja if (options.RequirePostQuantum) { ValidatePqRequirements(chain, result); } return result; } private void ConfigureChainPolicy(X509ChainPolicy policy, ValidationOptions options) { policy.RevocationMode = options.CheckRevocation ? X509RevocationMode.Online : X509RevocationMode.NoCheck; policy.RevocationFlag = X509RevocationFlag.EntireChain; policy.VerificationTime = options.ValidationTime ?? DateTime.UtcNow; // Application Policies (Extended Key Usage) if (options.RequiredEku != null) { policy.ApplicationPolicy.Add(options.RequiredEku); } // Certificate Policies if (options.RequiredPolicies != null) { foreach (var policyOid in options.RequiredPolicies) { policy.CertificatePolicy.Add(policyOid); } } // Prilagojena shramba zaupanja if (options.CustomTrustStore != null) { policy.CustomTrustStore.AddRange(options.CustomTrustStore); policy.TrustMode = X509ChainTrustMode.CustomRootTrust; } } private void ValidatePqRequirements(X509Chain chain, ValidationResult result) { foreach (var element in chain.ChainElements) { var cert = element.Certificate; var algorithm = cert.PublicKey.Oid.Value; // Preverjanje ali se uporablja PQ algoritem if (!IsPqAlgorithm(algorithm)) { result.Warnings.Add($"{cert.Subject}: Ni PQ algoritem ({algorithm})"); } } } private bool IsPqAlgorithm(string oid) { return oid switch { "2.16.840.1.101.3.4.3.17" => true, // ML-DSA-44 "2.16.840.1.101.3.4.3.18" => true, // ML-DSA-65 "2.16.840.1.101.3.4.3.19" => true, // ML-DSA-87 _ => false }; } } ---- ===== Možnosti validacije ===== public class ValidationOptions { // Čas validacije public DateTime? ValidationTime { get; set; } // Preverjanje preklica public bool CheckRevocation { get; set; } = true; // Extended Key Usage public Oid? RequiredEku { get; set; } // Certificate Policies public List? RequiredPolicies { get; set; } // Prilagojena shramba zaupanja public X509Certificate2Collection? CustomTrustStore { get; set; } // PQ zahteve public bool RequirePostQuantum { get; set; } // Časovna omejitev za spletna preverjanja public TimeSpan UrlTimeout { get; set; } = TimeSpan.FromSeconds(30); } // Primer: Validacija TLS strežnika var tlsOptions = new ValidationOptions { RequiredEku = new Oid("1.3.6.1.5.5.7.3.1"), // serverAuth CheckRevocation = true, RequirePostQuantum = true }; // Primer: Validacija podpisovanja kode var codeSigningOptions = new ValidationOptions { RequiredEku = new Oid("1.3.6.1.5.5.7.3.3"), // codeSigning CheckRevocation = true, ValidationTime = signatureTimestamp // Čas podpisa }; ---- ===== Statusne kode verige ===== ^ Status ^ Pomen ^ Kritično? ^ Rešitev ^ | **NoError** | Brez napak | Ne | - | | **NotTimeValid** | Potekel/še ni veljaven | Da | Obnovitev | | **NotTimeNested** | Časovna obdobja se ne prekrivajo | Da | Popravek verige | | **Revoked** | Preklican | Da | Nov certifikat | | **NotSignatureValid** | Neveljaven podpis | Da | Preverjanje verige | | **NotValidForUsage** | Napačen namen uporabe | Da | Pravilen certifikat | | **UntrustedRoot** | Korenski ni zaupanja vreden | Da | Shramba zaupanja | | **RevocationStatusUnknown** | CRL/OCSP nedosegljiv | Opozorilo | Preverjanje brez povezave | | **PartialChain** | Veriga nepopolna | Da | Dodajanje vmesnih certifikatov | ---- ===== Panožna validacija ===== ^ Panoga ^ Dodatna preverjanja ^ Policy OID-ji ^ | **WebPKI** | CT-Logs, EV-Policies | CA/B Forum | | **eIDAS** | QC-Statements, TSL-Check | 0.4.0.194121.1.* | | **Zdravstvo** | Poklicni atributi | gematik OID-ji | | **Avtomobilska industrija** | ECU-Policies | V2X specifični | ---- ===== Povezani scenariji ===== ^ Povezava ^ Scenarij ^ Opis ^ | **Predpogoj** | [[.:chain_building|5.1 Gradnja verige]] | Gradnja verige | | **Naslednji korak** | [[.:revocation_check|5.3 Preverjanje preklica]] | Preverjanje preklica | | **Povezano** | [[.:policy_validation|5.4 Validacija politik]] | Preverjanje politik | ---- << [[.:chain_building|← 5.1 Gradnja verige]] | [[.:start|↑ Pregled validacije]] | [[.:revocation_check|5.3 Preverjanje preklica →]] >> {{tag>scenarij validacija veriga x509 rfc5280}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//