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