====== 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}}