Exportieren archivierter privater Schlüssel aus der Zertifizierungsstellen-Datenbank

Wenn die Archivierung privater Schlüssel aktiviert wurde, kann es unter Umständen erforderlich sein, diese Schlüssel aus der Zertifizierungsstellen-Datenbank zu exportieren und in ein anderes Format (PKCS#12, PFX) umzuwandeln, beispielsweise für eine Langzeitarchivierung.

Nachfolgend eine Beschreibung der Vorgehensweise für den Export einzelner oder aller archivierten Schlüssel sowie der Gewinnung der notwendigen Metainformationen.

Grundlagen

Der ausführende Benutzer benötigt für diesen Schritt die Rechte "Manage CA" und "Issue and manage Certificates" auf der Zertifizierungsstelle.

Ein archivierter Schlüssel kann mit folgendem Befehl aus der Zertifizierungsstellen-Datenbank exportiert werden.

certutil -getkey {Seriennummer}

Bitte beachten, dass sich die Kommandozeilenausgabe je nach Zustand unterscheidet. Ist das für den exportierten Schlüssel erforderliche Key Recovery Agent (KRA) Zertifikat im Benutzerprofil des Benutzers, welcher den Export durchführt, vorhanden, werden die Metainformationen nicht ausgegeben. Aus diesem Grund kann es sinnvoll sein, den Befehl ohne die KRA Zertifikate auszuführen, um eine vollständige Information zu erhalten.

Der Benutzer besitzt das notwendige Key Recovery Agent Zertifikat nicht

Im weiteren Verlauf des Artikels wird jedoch ein Weg beschrieben, wie die gleiche Information vor dem Export aus der Zertifizierungsstellen-Datenbank ausgelesen und in einer Liste abgespeichert werden kann.

Der Benutzer besitzt das notwendige Key Recovery Agent Zertifikat

Ermitteln aller Schlüssel für den Export aus der Zertifizierungsstellen-Datenbank

Hinweis: Der ausführende Benutzer benötigt für diesen Schritt die Rechte "Manage CA" und "Issue and manage Certificates" auf der Zertifizierungsstelle.

Nicht alle in der Zertifizierungsstellen-Datenbank gespeicherten Zertifikate besitzen auch einen archivierten privaten Schlüssel. Eine Liste, welche Zertifikate dies sind, kann mit dem nachfolgendem Befehl ausgegeben werden. Die Ausgabe erfolgt im CSV-Format, welches sich perfekt für die Weiterverarbeitung anbietet.

certutil -view -restrict "KeyRecoveryHashes>0" -out SerialNumber csv

Für eine langzeit-Archivierung kann es sinnvoll sein, weitere Attribute mit in die Liste aufzunehmen. Beispielsweise bieten sich folgende Attribute an:

  • Das RequestId Attribut beschreibt den eindeutigen Identifizierer des Zertifikats in der Zertifizierungsstellen-Datenbank.
  • Das RequesterName Attribut beschreibt den Antragsteller des Zertifikats.
  • Das SerialNumber Attribut beschreibt die eindeutige Seriennummer des Zertifikats.
  • Das NotBefore Attribut beschreibt den Beginn der Gültigkeit des Zertifikats.
  • Das NotAfter Attribut beschreibt das Ende der Gültigkeit des Zertifikats.
  • Das KeyRecoveryHashes Attribut beschreibt, mit welchen Key Recovery Agenten-Zertifikaten der private Schlüssel archiviert wurde. Ist das der Schlüssel mit mehreren KRA Zertifikaten archiviert, werden diese durch ein "+" Zeichen getrennt dargestellt. Für die Wiederherstellung muss der private Schlüssel eines der KRA Zertifikate vorliegen.

Der angepasste Befehl sähe entsprechend wie folgt aus:

certutil -view -restrict "KeyRecoveryHashes>0" -out RequestId,RequesterName,SerialNumber,NotBefore,NotAfter,KeyRecoveryHashes csv

Um die Ergebnisse in eine Datei zu speichern, kann folgender Befehl verwendet werden.

certutil -view -restrict "KeyRecoveryHashes}0" -out RequestId,RequesterName,SerialNumber,NotBefore,NotAfter,KeyRecoveryHashes csv  } C:\LabFiles\SerialNumber.txt

Dieser Datensatz kann nun beispielsweise in Excel zur weiteren Auswertung importiert werden, oder mit der Windows PowerShell weiter verarbeitet werden.

Import-Csv -Path C:\LabFiles\SerialNumber.txt

Exportieren der Schlüssel aus der Zertifizierungsstellen-Datenbank

Die zuvor erstellte Liste der Seriennummern wird nun per Windows PowerShell eingelesen und zum Export der einzelnen Schlüssel verwendet.

Import-Csv -Path SerialNumber.txt | ForEach-Object -Process { certutil -getkey $_."Serial Number" "$($_."Serial Number").bin" }

Die verwendeten Kommandozeilen-Argumente für den certutil-Befehl bedeuten hierbei folgendes:

  • Das -getkey Argument weist an, dass der Schlüssel aus der Zertifizierungsstellen-Datenbank in eine Datei exportiert werden soll.

Dieser Schritt hat die Schlüssel lediglich aus der Datenbank exportiert, sie sind jedoch weiterhin verschlüsselt. Diese Form der Speicherung wäre z.B. zur Langzeit-Archivierung geeignet, sofern die Key Recovery Agent (KRA) Zertifikate weiterhin im Zugriff sind.

Entschlüsseln der archivierten Schlüsseln – Umwandlung in eine PFX-Datei

Der vorige Befehl hat die Schlüssel in verschlüsselter Form aus der Datenbank exportiert. Üblicherweise sollte dies bereits für eine sichere Archivierung ausreichen, wenn beispielsweise die Zertifizierungsstelle außer Betrieb genommen werden soll. Unter bestimmten Umständen ist es aber vielleicht gewünscht, die Schlüssel in das PKCS#12 Format (.pfx) umzuwandeln.

Für diesen Schritt ist es erforderlich, dass alle verwendeten Key Recovery Agent Zertifikate samt privater Schlüssel auf dem System installiert sind bzw. zur Verfügung stehen.

Im nachfolgenden Beispiel wird das gleiche Passwort für alle exportierten Schlüssel verwendet – somit ist die Sicherheit aller Schlüssel an die Kenntnis dieses einen Passwortes gebunden. Diese Vorgehensweise ist daher in der Praxis nicht zu empfehlen. Es sollten starke, zufallsgenerierte Passwörter und vor allem für jeden Schlüssel eindeutige Passwörter verwendet werden, was mit einer entsprechend komplexeren Programmlogik realisierbar wäre.

Um die archivierten Schlüssel zu exportieren, kann folgender Befehl verwendet werden.

Import-Csv -Path SerialNumber.txt | ForEach-Object -Process { certutil –p "P@$$w0rd" -recoverkey "$($_."Serial Number").bin" "$($_."Serial Number").pfx" }

Die verwendeten Kommandozeilen-Argumente für den certutil-Befehl bedeuten hierbei folgendes:

  • Das -p Argument gibt das Passwort für die zu erstellende PFX-Datei an.
  • Das -recoverkey Argument weist an, das der Schlüssel durch den Key Recovery Agenten entschlüsselt werden soll.

Sollte der Vorgang fehlschlagen, beispielsweise weil das passende Key Revovery Agent Zertifikat nicht vorliegt, wird dieses Ergebnis entsprechend ausgegeben und in der %ERRORLEVEL% Variable zur weiteren Bearbeitung abgespeichert.

Decrypt error: Cannot find the certificate and private key to use for decryption. 0x8009200c (-2146885620 CRYPT_E_NO_DECRYPT_CERT)
CertUtil: -RecoverKey command FAILED: 0x8009200c (-2146885620 CRYPT_E_NO_DECRYPT_CERT)
CertUtil: Cannot find the certificate and private key to use for decryption.

Weiterführende Links:

Externe Quellen

de_DEDeutsch