PKI: Aufräumen der Datenbank
Wenn man eine PKI hat, welche bereits ein paar Jahre in Betrieb ist und zudem noch automatische Zertifikate ausstellt, kann es sein, dass die Datenbank der Zertifizierungsstelle (kurz „CA-Datenbank“) so voll ist, dass manchmal sogar die Management-Konsole ihren Dienst verweigert. Spätestens dann sollte man die CA-Datenbank aufräumen – besser ist natürlich, wenn man dies bereits bei der Installation der PKI als regelmäßigen Job einplant.
Löschen von Einträgen
Mit dem Kommandozeilen-Tool „certutil“ kann man Einstellungen an der CA durchführen, im aktuellen Fall wird der Parameter „-deleterow“ benötigt:
certutil [Options] -deleteRow ROWID | Date [Request | CERT | Ext | Attrib | CRL]
Löschen einzelner Zeilen
Man kann gezielt einzelne Zeilen löschen, dafür muss einfach die RowID mit angegeben werden:
certutil -deleterow <RowId>
Löschen von abgelaufenen & widerrufenen Zertifikaten
Ein Löschen von alten Zertifikaten erfordert, dass man ein Zeitpunkt festlegt, bis wann Zertifikate gelöscht werden können. In diesem Beispiel werden also alle alten Zertifikate gelöscht, die älter als 01. Januar 2023 sind:
certutil -deleterow 01/01/2023 cert
Ein Löschen noch gültiger Zertifikate ist auf diese Weise also nicht möglich.
Löschen von alten Zertifikatsanfragen
Bevor ein Zertifikat ausgestellt wird, liegt erstmal eine Zertifikatsanfrage vor. Wird diese nicht bestätigt, bleibt sie liegen und wird in der Regel nicht aufgeräumt. Also sollte man dies auch regelmäßig tun. Dazu muss ein Zeitpunkt festlegt, bis wann Zertifikatsanfragen gelöscht werden können. In diesem Beispiel werden also alle alten Zertifikatanfragen gelöscht, die älter als 01. Januar 2023 sind:
certutil -deleterow 01/01/2023 request
Wichtiger Hinweis:
Das Datum muss im lokalen Format (Regionseinstellung des Computers, auf dem der Befehl ausgeführt wird), angegeben werden!
Timeouts
Sollte der Datensatz bereits zu groß sein, kann es zum Fehlercode „-939523027“ kommen. Hier könnte man sich mit einem kleinem Batchscript helfen, welches dann immer zum Anfang springt – hier im Beispiel werden Zertifikate und Zertifikatsanfragen aufgeräumt:
@echo off
:Top_cert
certutil -deleterow <Datum> Cert
If %ERRORLEVEL% EQU -939523027 goto Top_cert
:Top_request
certutil -deleterow <Datum> Request
If %ERRORLEVEL% EQU -939523027 goto Top_request
EXIT
Man kann das Script natürlich noch so erweitern, dass für die einzelnen Befehle als Datum eine Variable steht, welche zu Beginn einen Wert erhält. Zudem kann man den Datumswert auch berechnen lassen, also bspw. „heutiges Datum minus 60 Tag“. Dadurch könnte man das Skript mittels TaskScheduler automatisch jeden Tag laufen lassen und alle Zertifikatsanfragen und abgelaufenen Zertifikate, die älter als 60 Tage sind, werden gelöscht.
Nachweis / Logging
Ist das Eventlogging eingerichtet, erfolgt ein Eintrag im Eventlog „Security“ mit der Event-ID 4896 – hier ein Beispiel: