====== Runbook: Revoca certificato ======
**Durata:** ~5 minuti \\
**Ruolo:** Operatore PKI / Security \\
**Priorità:** ALTA in caso di compromissione
----
===== Workflow =====
flowchart TD
A[Richiesta revoca] --> B{Motivo?}
B -->|Compromissione| C[Bloccare SUBITO]
B -->|Sostituzione| D[Blocco pianificato]
B -->|Errore| E[Verificare + bloccare]
C --> F[Aggiornare CRL]
D --> F
E --> F
F --> G[Distribuire CRL]
G --> H[Aggiornare OCSP]
H --> I[Notifica]
I --> J[Documentazione]
style C fill:#ffebee
style F fill:#fff3e0
style G fill:#e3f2fd
----
===== Motivi di revoca (RFC 5280) =====
| Codice | Motivo | Quando usare |
|------|-------|----------------|
| 0 | unspecified | Standard (non consigliato) |
| 1 | keyCompromise | **Chiave privata compromessa** |
| 2 | cACompromise | CA compromessa |
| 3 | affiliationChanged | Cambio organizzazione |
| 4 | superseded | Sostituito da nuovo certificato |
| 5 | cessationOfOperation | Servizio dismesso |
| 9 | privilegeWithdrawn | Autorizzazione revocata |
----
===== Passo 1: Identificare il certificato =====
# Cercare per numero di serie
openssl x509 -in certificate.pem -serial -subject -noout
# Cercare nel database CA
grep -r "CN=server.example.com" /etc/pki/CA/index.txt
# PowerShell: Trovare certificato
Get-ChildItem Cert:\LocalMachine\My | Where-Object {
$_.Subject -like "*server.example.com*"
} | Select-Object SerialNumber, Subject, Thumbprint
----
===== Passo 2: Eseguire la revoca =====
==== OpenSSL (CLI) ====
# Revocare certificato
openssl ca -config openssl.cnf \
-revoke /path/to/certificate.pem \
-crl_reason keyCompromise
# Alternativa: Per numero di serie
openssl ca -config openssl.cnf \
-revoke_by_serial 01234567890ABCDEF \
-crl_reason keyCompromise
==== C# (WvdS.System.Security.Cryptography) ====
// Revocare certificato e creare CRL
var crlBuilder = new CertificateRevocationListBuilder();
// Aggiungere revoca
crlBuilder.AddEntry(
revokedCert.SerialNumber,
DateTimeOffset.UtcNow,
X509RevocationReason.KeyCompromise);
// Firmare CRL (modalità ibrida)
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);
----
===== Passo 3: Generare e distribuire CRL =====
# Generare nuova CRL
openssl ca -config openssl.cnf -gencrl -out crl.pem
# Convertire CRL in formato DER (per distribuzione)
openssl crl -in crl.pem -outform DER -out crl.der
# Verificare CRL
openssl crl -in crl.pem -text -noout
**Distribution Points:**
| Metodo | Destinazione | Comando |
|---------|------|--------|
| HTTP | Web-Server | ''cp crl.der /var/www/pki/crl.der'' |
| LDAP | Active Directory | ''ldapmodify -f update-crl.ldif'' |
| CDP | Nel certificato | Automatico via URL |
# Copiare CRL su Web-Server
scp crl.der webserver:/var/www/html/pki/crl.der
# Nginx/Apache Reload (se cache)
ssh webserver "systemctl reload nginx"
----
===== Passo 4: Aggiornare OCSP (se utilizzato) =====
# Aggiornare indice OCSP Responder (automatico con OpenSSL CA)
# Il responder legge /etc/pki/CA/index.txt
# Testare risposta OCSP
openssl ocsp \
-issuer intermediate.pem \
-cert certificate.pem \
-url http://ocsp.example.com \
-resp_text
**Risposta attesa dopo la revoca:**
Cert Status: revoked
Revocation Time: Dec 15 10:30:00 2024 GMT
Revocation Reason: keyCompromise
----
===== Passo 5: Notifica =====
**Notifiche obbligatorie:**
| Destinatario | Metodo | Contenuto |
|-----------|---------|--------|
| Titolare certificato | E-Mail | Numero di serie, motivo, prossimi passi |
| Security Team | Ticket | Dettagli incidente |
| Sistemi interessati | Alert | Automatico via monitoring |
# Inviare template e-mail
cat << 'EOF' | mail -s "Certificato revocato - Azione richiesta" admin@example.com
Il certificato è stato revocato:
Numero di serie: 01:23:45:67:89:AB:CD:EF
Subject: CN=server.example.com
Motivo: Key Compromise
Data: $(date -Iseconds)
Azione richiesta:
1. Configurare il servizio con nuovo certificato
2. Rimuovere il vecchio certificato da tutti i sistemi
Per domande: pki-team@example.com
EOF
----
===== Passo 6: Documentazione =====
| Campo | Valore |
|------|------|
| Numero di serie | ''01:23:45:67:89:AB:CD:EF'' |
| Subject | ''CN=server.example.com'' |
| Motivo revoca | ''keyCompromise'' |
| Data revoca | ''2024-12-15 10:30:00 UTC'' |
| Numero CRL | ''42'' |
| Operatore | ''Nome-Operatore'' |
| Ticket | ''SEC-2024-0815'' |
----
===== Emergenza: Revoca di massa =====
**In caso di compromissione CA:** → [[..:disaster-recovery:notfall-revocation|Runbook Revoca d'emergenza]]
# Revocare tutti i certificati di una CA
for cert in /etc/pki/CA/newcerts/*.pem; do
openssl ca -config openssl.cnf -revoke "$cert" -crl_reason cACompromise
done
# Nuova CRL con validità breve
openssl ca -config openssl.cnf -gencrl -crldays 1 -out emergency-crl.pem
----
===== Checklist =====
| # | Punto di verifica | |
|---|-----------|---|
| 1 | Certificato inserito nella CRL | |
| 2 | CRL firmata e valida | |
| 3 | CRL disponibile su tutti i CDP | |
| 4 | OCSP risponde ''revoked'' | |
| 5 | Titolare certificato notificato | |
| 6 | Ticket security documentato | |
----
===== Risoluzione problemi =====
| Problema | Causa | Soluzione |
|---------|---------|--------|
| ''already revoked'' | Doppia revoca | Ignorare |
| ''unknown serial'' | Non da questa CA | Verificare CA |
| CRL non valida | Errore firma | Verificare chiave CA |
| OCSP risponde ''good'' | Cache/Sync | Riavviare OCSP Responder |
----
===== Runbook correlati =====
* [[.:zertifikat-ausstellen|Emissione certificato]] - Certificato sostitutivo
* [[..:disaster-recovery:notfall-revocation|Revoca d'emergenza]] - Revoca di massa
* [[it:int:pqcrypt:szenarien:kurzreferenz:validierung|Riferimento rapido validazione]] - Verifica CRL/OCSP
----
<< [[.:zertifikat-erneuern|Rinnovo certificato]] | [[.:health-check|Health Check]] >>
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//
{{tag>runbook certificato revoca revocation crl ocsp operator}}