====== Runbook: Zertifikat widerrufen ====== **Dauer:** ~5 Minuten \\ **Rolle:** PKI-Operator / Security \\ **Priorität:** HOCH bei Kompromittierung ---- ===== Workflow ===== flowchart TD A[Widerrufsanfrage] --> B{Grund?} B -->|Kompromittierung| C[SOFORT sperren] B -->|Ablösung| D[Geplant sperren] B -->|Fehler| E[Prüfen + sperren] C --> F[CRL aktualisieren] D --> F E --> F F --> G[CRL verteilen] G --> H[OCSP aktualisieren] H --> I[Benachrichtigung] I --> J[Dokumentation] style C fill:#ffebee style F fill:#fff3e0 style G fill:#e3f2fd ---- ===== Widerrufsgründe (RFC 5280) ===== | Code | Grund | Wann verwenden | |------|-------|----------------| | 0 | unspecified | Standard (nicht empfohlen) | | 1 | keyCompromise | **Privater Schlüssel kompromittiert** | | 2 | cACompromise | CA kompromittiert | | 3 | affiliationChanged | Organisation gewechselt | | 4 | superseded | Durch neues Zertifikat ersetzt | | 5 | cessationOfOperation | Dienst eingestellt | | 9 | privilegeWithdrawn | Berechtigung entzogen | ---- ===== Schritt 1: Zertifikat identifizieren ===== # Nach Seriennummer suchen openssl x509 -in certificate.pem -serial -subject -noout # In CA-Datenbank suchen grep -r "CN=server.example.com" /etc/pki/CA/index.txt # PowerShell: Zertifikat finden Get-ChildItem Cert:\LocalMachine\My | Where-Object { $_.Subject -like "*server.example.com*" } | Select-Object SerialNumber, Subject, Thumbprint ---- ===== Schritt 2: Widerruf durchführen ===== ==== OpenSSL (CLI) ==== # Zertifikat widerrufen openssl ca -config openssl.cnf \ -revoke /path/to/certificate.pem \ -crl_reason keyCompromise # Alternative: Nach Seriennummer openssl ca -config openssl.cnf \ -revoke_by_serial 01234567890ABCDEF \ -crl_reason keyCompromise ==== C# (WvdS.System.Security.Cryptography) ==== // Zertifikat widerrufen und CRL erstellen var crlBuilder = new CertificateRevocationListBuilder(); // Widerruf hinzufügen crlBuilder.AddEntry( revokedCert.SerialNumber, DateTimeOffset.UtcNow, X509RevocationReason.KeyCompromise); // CRL signieren (Hybrid-Modus) 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); ---- ===== Schritt 3: CRL generieren und verteilen ===== # Neue CRL generieren openssl ca -config openssl.cnf -gencrl -out crl.pem # CRL in DER-Format konvertieren (für Distribution) openssl crl -in crl.pem -outform DER -out crl.der # CRL prüfen openssl crl -in crl.pem -text -noout **Distribution Points:** | Methode | Ziel | Befehl | |---------|------|--------| | HTTP | Web-Server | ''cp crl.der /var/www/pki/crl.der'' | | LDAP | Active Directory | ''ldapmodify -f update-crl.ldif'' | | CDP | In Zertifikat | Automatisch via URL | # CRL auf Web-Server kopieren scp crl.der webserver:/var/www/html/pki/crl.der # Nginx/Apache Reload (falls Cache) ssh webserver "systemctl reload nginx" ---- ===== Schritt 4: OCSP aktualisieren (falls verwendet) ===== # OCSP-Responder Index aktualisieren (automatisch bei OpenSSL CA) # Der Responder liest /etc/pki/CA/index.txt # OCSP-Response testen openssl ocsp \ -issuer intermediate.pem \ -cert certificate.pem \ -url http://ocsp.example.com \ -resp_text **Erwartete Antwort nach Widerruf:** Cert Status: revoked Revocation Time: Dec 15 10:30:00 2024 GMT Revocation Reason: keyCompromise ---- ===== Schritt 5: Benachrichtigung ===== **Pflicht-Benachrichtigungen:** | Empfänger | Methode | Inhalt | |-----------|---------|--------| | Zertifikatsinhaber | E-Mail | Seriennummer, Grund, nächste Schritte | | Security Team | Ticket | Incident-Details | | Betroffene Systeme | Alert | Automatisch via Monitoring | # E-Mail-Template senden cat << 'EOF' | mail -s "Zertifikat widerrufen - Aktion erforderlich" admin@example.com Zertifikat wurde widerrufen: Seriennummer: 01:23:45:67:89:AB:CD:EF Subject: CN=server.example.com Grund: Key Compromise Datum: $(date -Iseconds) Aktion erforderlich: 1. Dienst mit neuem Zertifikat konfigurieren 2. Altes Zertifikat aus allen Systemen entfernen Bei Fragen: pki-team@example.com EOF ---- ===== Schritt 6: Dokumentation ===== | Feld | Wert | |------|------| | Seriennummer | ''01:23:45:67:89:AB:CD:EF'' | | Subject | ''CN=server.example.com'' | | Widerrufsgrund | ''keyCompromise'' | | Widerrufsdatum | ''2024-12-15 10:30:00 UTC'' | | CRL-Nummer | ''42'' | | Operator | ''Operator-Name'' | | Ticket | ''SEC-2024-0815'' | ---- ===== Notfall: Massen-Widerruf ===== **Bei CA-Kompromittierung:** → [[..:disaster-recovery:notfall-revocation|Notfall-Revocation Runbook]] # Alle Zertifikate einer CA widerrufen for cert in /etc/pki/CA/newcerts/*.pem; do openssl ca -config openssl.cnf -revoke "$cert" -crl_reason cACompromise done # Neue CRL mit kurzer Gültigkeit openssl ca -config openssl.cnf -gencrl -crldays 1 -out emergency-crl.pem ---- ===== Checkliste ===== | # | Prüfpunkt | ✓ | |---|-----------|---| | 1 | Zertifikat in CRL eingetragen | ☐ | | 2 | CRL signiert und gültig | ☐ | | 3 | CRL auf allen CDPs verfügbar | ☐ | | 4 | OCSP antwortet ''revoked'' | ☐ | | 5 | Zertifikatsinhaber benachrichtigt | ☐ | | 6 | Security-Ticket dokumentiert | ☐ | ---- ===== Fehlerbehebung ===== | Problem | Ursache | Lösung | |---------|---------|--------| | ''already revoked'' | Doppelter Widerruf | Ignorieren | | ''unknown serial'' | Nicht von dieser CA | CA prüfen | | CRL ungültig | Signatur-Fehler | CA-Key prüfen | | OCSP antwortet ''good'' | Cache/Sync | OCSP-Responder neustarten | ---- ===== Verwandte Runbooks ===== * [[.:zertifikat-ausstellen|Zertifikat ausstellen]] – Ersatzzertifikat * [[..:disaster-recovery:notfall-revocation|Notfall-Revocation]] – Massen-Widerruf * [[de:int:pqcrypt:szenarien:kurzreferenz:validierung|Validierung Kurzreferenz]] – CRL/OCSP-Prüfung ---- << [[.:zertifikat-erneuern|← Zertifikat erneuern]] | [[.:health-check|→ Health Check]] >> ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional// {{tag>runbook zertifikat widerruf revocation crl ocsp operator}}