~~NOTOC~~ ====== Scenarij 4.1: Obnova certifikata (Renewal) ====== **Kategorija:** [[.:start|Upravljanje certifikatima]] \\ **Složenost:** ⭐⭐⭐ (Srednja) \\ **Preduvjeti:** Postojeći certifikat, isti ključ \\ **Procijenjeno vrijeme:** 10-15 minuta ---- ===== Opis ===== Ovaj scenarij opisuje **obnovu certifikata koji istječe** uz zadržavanje postojećeg para ključeva. Obnova ima smisla kada ključ nije kompromitiran i jačina ključa je još uvijek dostatna. **Obnova vs. Re-Key:** ^ Aspekt ^ Obnova ^ Re-Key ^ | Par ključeva | Isti | Novi | | CSR | Opcionalno novi | Obavezno novi | | Subject | Može se prilagoditi | Može se prilagoditi | | Razlog | Istek | Kompromitacija, nadogradnja | ---- ===== Tijek rada ===== flowchart LR LOAD[Učitavanje starog certifikata] --> CHECK[Provjera isteka] CHECK --> CSR[CSR s istim ključem] CSR --> ISSUE[Novi certifikat] ISSUE --> DEPLOY[Deployment] DEPLOY --> REVOKE[Opoziv starog] style ISSUE fill:#e8f5e9 ---- ===== Primjer koda (C#) ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using var ctx = PqCryptoContext.Initialize(); // Učitavanje postojećeg certifikata i ključa var oldCert = ctx.LoadCertificate("server.crt.pem"); var existingKey = ctx.LoadPrivateKey("server.key.pem", "KeyPassword!"); // Učitavanje CA var caCert = ctx.LoadCertificate("intermediate-ca.crt.pem"); var caKey = ctx.LoadPrivateKey("intermediate-ca.key.pem", "CaPassword!"); // Provjera ima li smisla obnova var daysUntilExpiry = (oldCert.NotAfter - DateTime.UtcNow).Days; if (daysUntilExpiry > 90) { Console.WriteLine($"Certifikat još {daysUntilExpiry} dana valjan."); } // Kreiranje CSR-a s postojećim ključem var csr = ctx.CreateCertificateRequest( existingKey, oldCert.SubjectName, // Preuzimanje Subjecta ctx.GetExtensions(oldCert) // Preuzimanje ekstenzija ); // Izdavanje novog certifikata var newCert = ctx.IssueCertificate( csr, issuerCert: caCert, issuerKey: caKey, serialNumber: ctx.GenerateSerialNumber(), // Novi Serial! validFrom: DateTime.UtcNow.AddDays(-1), // Preklapanje validDays: 365, extensions: new ExtBuilder() .BasicConstraints(ca: false, critical: true) .KeyUsage(KeyUsageFlags.DigitalSignature | KeyUsageFlags.KeyEncipherment) .ExtendedKeyUsage(ExtKeyUsage.ServerAuth) .SubjectKeyIdentifier(existingKey.PublicKey) // Isti SKI! .AuthorityKeyIdentifier(caCert) .CrlDistributionPoint("http://crl.example.com/intermediate.crl") .Build() ); // Spremanje newCert.ToPemFile("server-renewed.crt.pem"); Console.WriteLine("Certifikat obnovljen:"); Console.WriteLine($" Stari Serial: {oldCert.SerialNumber}"); Console.WriteLine($" Novi Serial: {newCert.SerialNumber}"); Console.WriteLine($" Novi datum isteka: {newCert.NotAfter:yyyy-MM-dd}"); ---- ===== Automatska provjera obnove ===== // Provjera svih certifikata u storeu public IEnumerable GetExpiringCertificates( X509Store store, int warningDays = 30) { store.Open(OpenFlags.ReadOnly); try { return store.Certificates .Where(c => c.NotAfter <= DateTime.UtcNow.AddDays(warningDays)) .Where(c => c.NotAfter > DateTime.UtcNow) // Još nije istekao .OrderBy(c => c.NotAfter) .ToList(); } finally { store.Close(); } } // Korištenje using var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); var expiring = GetExpiringCertificates(store, warningDays: 30); foreach (var cert in expiring) { Console.WriteLine($"UPOZORENJE: {cert.Subject} istječe {cert.NotAfter:d}"); } ---- ===== Ciklusi obnove po industrijama ===== ^ Industrija ^ Tipični ciklus ^ Vrijeme unaprijed ^ Posebnost ^ | **Standardni IT** | 1 godina | 30 dana | Preporučena automatizacija | | **Energetika/SCADA** | 3-5 godina | 90 dana | Obratiti pažnju na prozore održavanja | | **Zdravstvo** | 1-2 godine | 60 dana | Potreban audit trag | | **Automobilska** | 2-3 godine | 180 dana | Planiranje OTA ažuriranja | ---- ===== Najbolje prakse ===== **Preporuke za obnovu:** * Planirati vrijeme preklapanja (stari certifikat 1-7 dana nakon obnove još valjan) * Implementirati automatski monitoring * Opozvati stari certifikat tek nakon uspješnog deploymenta * Subject Key Identifier ostaje isti (olakšava praćenje) **Kada NE obnavljati:** * Ključ možda kompromitiran → [[.:rekey|Re-Key]] * Potrebna nadogradnja algoritma (RSA → ML-DSA) → [[.:rekey|Re-Key]] * Duljina ključa prekratka → [[.:rekey|Re-Key]] ---- ===== Povezani scenariji ===== ^ Odnos ^ Scenarij ^ Opis ^ | **Alternativa** | [[.:rekey|4.2 Re-Key]] | Novi ključ | | **Sljedeći korak** | [[hr:int:pqcrypt:szenarien:widerruf:zertifikat_widerrufen|6.4 Opoziv]] | Stari certifikat | | **Povezano** | [[.:backup|4.4 Sigurnosna kopija]] | Prije obnove osigurati | ---- << [[.:start|← Pregled upravljanja]] | [[hr:int:pqcrypt:szenarien:start|↑ Scenariji]] | [[.:rekey|4.2 Re-Key →]] >> {{tag>scenarij upravljanje obnova produljenje certifikat}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//