Zertifikate mit privaten Schlüssel übertragen (wenn privater Schlüssel nicht exportierbar)

Bei einer Servermigration ist das Problem aufgetreten, dass ein Zertifikat nicht exportiert werden konnte. Bei der Migration sollte nur das Betriebssystem gegen eine aktuelle Version ausgetauscht werden, das Zertifikat sollte, wenn möglich weiter genutzt werden. In dem konkreten Fall handelte es sich um ein Wildcard Zertifikat, bei dem allerdings beim Import die Einstellung „Privater Schlüssel als exportierbar markieren (Mark this key as exportable)“ nicht gesetzt wurde.

Zertifikate mit privaten Schlüssel übertragen (wenn privater Schlüssel nicht exportierbar)

Das Zertifikat mit dem privaten Schlüssel lässt sich somit nicht einfach via MMC exportieren und auf dem neuen Server importieren. Um das Zertifikat trotzdem auf dem neuen Server nutzen zu können, muss man etwas tricksen. Die Vorgehensweise habe ich mal in einer Testumgebung nachgestellt.

In meiner Testumgebung habe ich ein Zertifikat, welches nicht mit dem Flag „Mark this key as exportable“ importiert wurde. In diesem Fall handelt es sich um das Zertifikat mit dem Common Name „DC1.ad.frankysweblab.de“ (als Beispiel).

Quellserver (Zertifikat und Schlüssel exportieren)

Damit das Zertifikat inklusive des privaten Schlüssels auf einem anderen Server übertragen werden kann, müssen ein paar Infos gesammelt werden. Zunächst wird der Thumbprint des Zertifikats benötigt, welches vom Quellserver auf den Zielserver übertragen werden soll. Der folgende Befehl kann genutzt werden, um auf dem Quellserver Thumbprint und CNs anzuzeigen:

Get-ChildItem -Path Cert:\LocalMachine\my
Zertifikate anzeigen mit PowerShell

Wie bereits erwähnt, lässt sich der private Schlüssel des Zertifikats mit dem CN „DC1.ad.frankysweblab.de“ nicht exportieren.

Um das Zertifikat dennoch auf den Zielserver zu übertragen, wird der Name des privaten Schlüssels im Dateisystem benötigt. Der Name lässt sich anhand des Thumbprints des Zertifikats rausfinden:

(Get-Item Cert:\LocalMachine\My\E8254B658C645C2B57DD0103CA65BE13CC9D5935).PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
Dateiname des privaten Schlüssels finden

Dies ist nun der Dateiname des privaten Schlüssels welcher unter dem Pfad „C:\Users\All Users\Microsoft\Crypto\RSA\MachineKeys“ gespeichert wird. Damit es etwas einfacher ist, wird der private Schlüssel nach C:\ kopiert:

Copy-Item "C:\Users\All Users\Microsoft\Crypto\RSA\MachineKeys\f97266d1ef98e6a0ceb271258b70163a_6f560699-8cc6-4aeb-bc83-42d42adf7863" c:\

Jetzt muss das Zertifikat ohne den privaten Schlüssel exportiert werden, dies kann via MMC erfolgen. Die .CER Datei kann ebenfalls unter C:\ gespeichert werden:

Zertifikat exportieren

Unter c:\ sollten nun 2 Dateien existieren, eine mit dem exportierten privaten Schlüssel und eine welche das Zertifikat enthält:

Zertifikat und privaten Schlüssel speichern

Zielserver (Import)

Beide Dateien müssen nun auf dem Zielserver kopiert werden. Das Zertifikat (ohne den privaten Schlüssel), kann direkt in den Zertifikatsspeicher des Computers importiert werden:

Zertifikat importieren

Damit Zertifikat und privater Schlüssel auf dem Zielserver wieder zusammenfinden, muss das Zertifikat an die gleichen Speicherort importiert werden (Personal Certificates). Das Zertifikat ist nun also importiert, aber es fehlt noch der private Schlüssel:

Dem Zertifikat fehlt noch der private Schlüssel

Damit der private Schlüssel auf dem Zielserver importiert werden kann, muss die Datei mit dem kryptischen Namen umbenannt werden. Der zweite Teil des Dateinamens ist die GUID des Quellservers (die Zeichenfolge nach dem Unterstrich „_“), diese GUID muss nun mit GUID des Zielservers ersetzt werden. Dazu wird jetzt die GUID des Zielservers benötigt, diese kann mit folgendem Befehl auf dem Zielserver abgefragt werden:

Get-ItemPropertyValue HKLM:\SOFTWARE\Microsoft\Cryptography\ -Name MachineGuid
GUID finden

Damit es etwas deutlicher wird, habe ich mal die Original Datei und die umbenannte Datei in dem Ordner belassen, wie zu sehen ist, wurde die Zeichenfolge nach dem Unterstrich mit der GUID des Zielservers ersetzt:

Datei mit privaten Schlüssel umbenennen

Die so umbenannte Datei muss nun wieder nach „C:\Users\All Users\Microsoft\Crypto\RSA\MachineKeys“ auf dem Zielserver kopiert werden, eine PowerShell mit Admin Rechten reicht hier aus:

Move-Item C:\f97266d1ef98e6a0ceb271258b70163a_39428449-e697-4b7f-b1b8-49ca15e421a4 'C:\Users\All Users\Microsoft\Crypto\RSA\MachineKeys\'
Datei verschieben

Jetzt wird wieder der Thumbprint des Zertifikats benötigt. Zertifikat und privater Schlüssel können mit dem Thumbprint des Zertifikats wieder auf dem Zielserver zusammengefügt werden:

certutil.exe -repairstore my E8254B658C645C2B57DD0103CA65BE13CC9D5935
Zertifikat und privaten Schlüssel zusammenführen

Fertig. In der MMC wird nun auch angezeigt, dass der private Schlüssel für das Zertifikat vorhanden ist:

Übersicht des Zertifikats inkl. privaten Schlüssel

Auf dem Zielserver ist der private Schlüssel übrigens wieder gegen Export geschützt.

1 Gedanke zu „Zertifikate mit privaten Schlüssel übertragen (wenn privater Schlüssel nicht exportierbar)“

Schreibe einen Kommentar