====== Runbook: Opoziv certifikata ====== **Trajanje:** ~5 minuta \\ **Uloga:** PKI operator / Security \\ **Prioritet:** VISOK kod kompromitacije ---- ===== Workflow ===== flowchart TD A[Zahtjev za opoziv] --> B{Razlog?} B -->|Kompromitacija| C[ODMAH blokirati] B -->|Zamjena| D[Planirano blokiranje] B -->|Greška| E[Provjera + blokiranje] C --> F[Ažuriranje CRL-a] D --> F E --> F F --> G[Distribucija CRL-a] G --> H[Ažuriranje OCSP-a] H --> I[Obavijest] I --> J[Dokumentacija] style C fill:#ffebee style F fill:#fff3e0 style G fill:#e3f2fd ---- ===== Razlozi opoziva (RFC 5280) ===== | Kod | Razlog | Kada koristiti | |-----|--------|----------------| | 0 | unspecified | Standard (ne preporučuje se) | | 1 | keyCompromise | **Privatni ključ kompromitiran** | | 2 | cACompromise | CA kompromitiran | | 3 | affiliationChanged | Promjena organizacije | | 4 | superseded | Zamijenjen novim certifikatom | | 5 | cessationOfOperation | Usluga ukinuta | | 9 | privilegeWithdrawn | Ovlasti opozvane | ---- ===== Korak 1: Identifikacija certifikata ===== # Pretraživanje po serijskom broju openssl x509 -in certificate.pem -serial -subject -noout # Pretraživanje u CA bazi podataka grep -r "CN=server.example.com" /etc/pki/CA/index.txt # PowerShell: Pronalaženje certifikata Get-ChildItem Cert:\LocalMachine\My | Where-Object { $_.Subject -like "*server.example.com*" } | Select-Object SerialNumber, Subject, Thumbprint ---- ===== Korak 2: Provođenje opoziva ===== ==== OpenSSL (CLI) ==== # Opoziv certifikata openssl ca -config openssl.cnf \ -revoke /path/to/certificate.pem \ -crl_reason keyCompromise # Alternativa: Po serijskom broju openssl ca -config openssl.cnf \ -revoke_by_serial 01234567890ABCDEF \ -crl_reason keyCompromise ==== C# (WvdS.System.Security.Cryptography) ==== // Opoziv certifikata i kreiranje CRL-a var crlBuilder = new CertificateRevocationListBuilder(); // Dodavanje opoziva crlBuilder.AddEntry( revokedCert.SerialNumber, DateTimeOffset.UtcNow, X509RevocationReason.KeyCompromise); // Potpisivanje CRL-a (hibridni način) using var issuerCert = new X509Certificate2("ca.pfx", "password"); var crlNumber = BigInteger.Parse("42"); var nextUpdate = DateTimeOffset.UtcNow.AddDays(7); byte[] crl = crlBuilder.Build( issuerCert, crlNumber, nextUpdate, HashAlgorithmName.SHA384, CryptoMode.Hybrid); File.WriteAllBytes("crl.der", crl); ---- ===== Korak 3: Generiranje i distribucija CRL-a ===== # Generiranje novog CRL-a openssl ca -config openssl.cnf -gencrl -out crl.pem # Konverzija CRL-a u DER format (za distribuciju) openssl crl -in crl.pem -outform DER -out crl.der # Provjera CRL-a openssl crl -in crl.pem -text -noout **Distribution Points:** | Metoda | Cilj | Naredba | |--------|------|---------| | HTTP | Web server | ''cp crl.der /var/www/pki/crl.der'' | | LDAP | Active Directory | ''ldapmodify -f update-crl.ldif'' | | CDP | U certifikatu | Automatski putem URL-a | # Kopiranje CRL-a na web server scp crl.der webserver:/var/www/html/pki/crl.der # Nginx/Apache Reload (ako postoji cache) ssh webserver "systemctl reload nginx" ---- ===== Korak 4: Ažuriranje OCSP-a (ako se koristi) ===== # Ažuriranje OCSP responder indexa (automatski kod OpenSSL CA) # Responder čita /etc/pki/CA/index.txt # Testiranje OCSP odgovora openssl ocsp \ -issuer intermediate.pem \ -cert certificate.pem \ -url http://ocsp.example.com \ -resp_text **Očekivani odgovor nakon opoziva:** Cert Status: revoked Revocation Time: Dec 15 10:30:00 2024 GMT Revocation Reason: keyCompromise ---- ===== Korak 5: Obavijest ===== **Obavezne obavijesti:** | Primatelj | Metoda | Sadržaj | |-----------|--------|---------| | Vlasnik certifikata | E-Mail | Serijski broj, razlog, sljedeći koraci | | Security tim | Ticket | Detalji incidenta | | Pogođeni sustavi | Alert | Automatski putem monitoringa | # Slanje e-mail predloška cat << 'EOF' | mail -s "Certifikat opozvan - Potrebna akcija" admin@example.com Certifikat je opozvan: Serijski broj: 01:23:45:67:89:AB:CD:EF Subject: CN=server.example.com Razlog: Key Compromise Datum: $(date -Iseconds) Potrebna akcija: 1. Konfiguriranje usluge s novim certifikatom 2. Uklanjanje starog certifikata iz svih sustava Za pitanja: pki-team@example.com EOF ---- ===== Korak 6: Dokumentacija ===== | Polje | Vrijednost | |-------|------------| | Serijski broj | ''01:23:45:67:89:AB:CD:EF'' | | Subject | ''CN=server.example.com'' | | Razlog opoziva | ''keyCompromise'' | | Datum opoziva | ''2024-12-15 10:30:00 UTC'' | | CRL broj | ''42'' | | Operator | ''Ime operatera'' | | Ticket | ''SEC-2024-0815'' | ---- ===== Nužda: Masovni opoziv ===== **Kod kompromitacije CA:** → [[..:disaster-recovery:notfall-revocation|Runbook za hitni opoziv]] # Opoziv svih certifikata jednog CA for cert in /etc/pki/CA/newcerts/*.pem; do openssl ca -config openssl.cnf -revoke "$cert" -crl_reason cACompromise done # Novi CRL s kratkim rokom valjanosti openssl ca -config openssl.cnf -gencrl -crldays 1 -out emergency-crl.pem ---- ===== Kontrolna lista ===== | # | Točka provjere | ✓ | |---|----------------|---| | 1 | Certifikat upisan u CRL | ☐ | | 2 | CRL potpisan i valjan | ☐ | | 3 | CRL dostupan na svim CDP-ovima | ☐ | | 4 | OCSP odgovara ''revoked'' | ☐ | | 5 | Vlasnik certifikata obaviješten | ☐ | | 6 | Security ticket dokumentiran | ☐ | ---- ===== Rješavanje problema ===== | Problem | Uzrok | Rješenje | |---------|-------|----------| | ''already revoked'' | Dvostruki opoziv | Ignorirati | | ''unknown serial'' | Nije od ovog CA | Provjeriti CA | | CRL nevaljan | Greška potpisa | Provjeriti CA ključ | | OCSP odgovara ''good'' | Cache/Sync | Ponovno pokrenuti OCSP responder | ---- ===== Povezani runbookovi ===== * [[.:zertifikat-ausstellen|Izdavanje certifikata]] – Zamjenski certifikat * [[..:disaster-recovery:notfall-revocation|Hitni opoziv]] – Masovni opoziv * [[hr:int:pqcrypt:szenarien:kurzreferenz:validierung|Kratki pregled validacije]] – Provjera CRL/OCSP ---- << [[.:zertifikat-erneuern|← Obnova certifikata]] | [[.:health-check|→ Health Check]] >> ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional// {{tag>runbook certifikat opoziv revocation crl ocsp operator}}