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