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.

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

  1. Hallo Frank,

    leider benötige ich diese Prozedur.
    Beim letzten Step erscheint bei mir jedoch eine SmartCard Abfrage.
    Bis dahin hat alles super funktioniert.

    Kannst du mir sagen was ich falsch mache?

    Viele Grüße Dirk

    Antworten
  2. Hallo, und Danke für den informativen Artikel!
    Eine Frage zum generellen Verständnis hätte ich noch:
    Gibt es eigentlich noch irgendeinen Weg (abgesehen vom vorherigen Beitrag), ein Zertifikat samt privatem Schlüssel zu exportieren? Ich habe das Problem mit einem Exchange 2016, der läuft bei uns in einer Domäne mit eigener PKI. Zum einen hätte ich gerne aus Sicherheitsgründen das Exchange-Zert samt Schlüssel nochmals weggesichert. Zum anderen – was macht man mit Usern, die gerne auf ihrem Apple, Android usw. ihr Mail-Konto haben wollen? Mir fehlt da gerade der Ansatz…

    mfG
    Karsten

    Antworten
    • der Private Schlüssel darf unter keinen Umständen herausgegeben werden!
      Wenn der Exchange mit einem nicht öffentlichen Zertifikat betrieben wird, dann müssen die User auf ihren Mobilgeräten auch das Root und alle Ziwschenzertifikate einspielen.
      Dann sollten sie dem Zertifikat des Exchange auch vertrauen.
      Wobei es heute eigentlich keinen Grund mehr gibt, gerade der Exchange öffentlich erreichbar ist, auf ein selbst signiertes Zertifikat zurückzugreifen, da Lets’Encrypt kostenlose Zertifikate ausstellt und Frank auch diverse Anleitungen dazu veröffentlich hat.

      Antworten
      • Bug By Design, aber der Windows Defender haut es direkt weg.
        Konnte das Zertifikat in meinem Fall dadurch nur direkt per CMD exportieren. Die „SYSTEM“ Zertifikate hat er mir nicht in der mmc geöffnet.

        Lustig fand ich die Warnung vom Windows Defender (Schriftzeichen nicht geändert!):
        „Τђїŝ άρρŀįςąŧĭōň ώаś гèmθνεđ ъ℮сàύŝę ιŧ ϊş ьłõĉκëδ āςςōгđілğ ťσ тђĕ Μіςгоŝόƒť Đéƒėņð℮ř ƒõř Ëńđρòìпτ φõĺĭςý.“

        Antworten

Schreibe einen Kommentar