Powershell-Script „Certificate Request Tool“

Update V2.09

Die aktuelle Version V2.09.0001 habe ich am 20.12.2025 veröffentlicht. Sie hat im Vergleich zur vorherigen Version einige Neuerungen und Bugixes erhalten. Details dazu könnt ihr in meinem Gitlab nachlesen. Da gibt es auch den Download: https://gitlab.ws-its.de/stephan/ps-certificaterequesttool

Ziel der Anwendung

Für das bequeme und schnelle Anfragen von Zertifikaten an einer internen Windows Zertifizierungsstelle existieren aus meiner Sicht keine geeigneten Tools. Mit der grafischen Oberfläche mmc kann man natürlich manuell Zertifikate für den eigenen Benutzer und den lokalen Computer anfragen. Aber sehr oft benötige ich Zertifikate für andere Geräte. Nach dem Ausstellen mit der mmc muss das Zertifikat also erst als PFX-Datei im pkcs12-Format inklusive Private Key exportiert werden. Und wenn dann noch eine Konvertierung und eine Zerlegung in eine PEM- und eine KEY-Datei erforderlich wird, dann wird es schnell kompliziert. Dafür geht es in der cmd mit openssl.exe weiter…

Ebenso kann ein Certificate Signing Request von einem Drittsystem grafisch nur in der Zertifizierungsstelle selber eingereicht werden. Dann muss aber das signierte Zertifikat manuell aus der Datenbank der CA in eine CER-Datei exportiert werden.

Natürlich gibt es auch den cmd-Befehl certreq.exe, aber die Verwendung ist nicht sehr intuitiv. Also ist das auch keine Option für die Masse der Administratoren, die ein Zertifikat für ihren Service oder ihr Device benötigen, aber wenig Erfahrung mit Zertifizierungsstellen haben.

Für mich waren diese Gründe der Anlass, ein PowerShell-Script zu schreiben, dass die Vorteile der cmd-Befehle certreq.exe und openssl.exe einfach anspricht. Und damit der Komfort nicht auf der Strecke bleibt und cmd-Befehle durch PowerShell-Befehle ersetzt werden, rendert mein Script eine grafische Oberfläche.

Bestandteile

Die Dateien

Das Script selber besteht aus einer ps1-Datei mit der Befehlslogik und einer ini-Datei, in der Variablen angepasst werden können. Der Vorteil der ini-Datei ist klar: Die PowerShell-Scriptdatei kann bei einem Update leichter ausgetauscht werden, da individuelle Anpassungen darin nicht notwendig sind. Diese befinden sich ja in der ini-Datei. Ebenso könnte man das Script auch digital signieren, da es vom Anwender nicht verändert werden muss.

Beide Dateien können in einem beliebigen Verzeichnis abgelegt werden. Wichtig ist nur, dass beide nebeneinander liegen und nicht umbenannt werden. Das Verzeichnis Certificates wird automatisch beim ersten Scriptlauf erstellt. Es wird später die ausgestellten Zertifikate enthalten.

Powershell-Script „Certificate Request Tool“

Die Konfigurationsdatei

Für den Start ist die Konfigurationsdatei wichtig. Diese ist in mehrere Blöcke unterteilt. Ändert die Werte rechts neben dem =-Zeichen auf eure Anforderung. In fast jeder Zeile gibt es rechts neben der # eine Auflistung erlaubter Werte und eine Erklärung:

Powershell-Script „Certificate Request Tool“

Vergleicht man die geforderten Werte mit den angezeigten Werten der GUI zur Laufzeit, dann werden viele Eingaben sich selbst erklären:

Powershell-Script „Certificate Request Tool“

Das sind die Werte im Detail

Eigenschaftgültige WerteBeschreibung
DefaultCA<String>Falls ihr ein Zertifikat immer von einer bestimmten Zertifizierungsstelle erhalten wollt, dann tragt diese hier ein. Eure Namen könnt ihr bei einem gestarteten Script im Feld Enrollment Service (CA) sehen und auch raus kopieren. Lasst das Feld leer, wenn ihr die CA immer zur Laufzeit auswählen wollt.

DefaultTemplate

<String>

Der Name der Zertifikatvorlage, die voreingestellt werden soll. Ist der Benutzer für diese Vorlage nicht berechtig, bleibt das Feld in der GUI leer. Will der Benutzer ein anderes Template wählen, dann ist das zur Laufzeit durch das DropDown-Feld möglich.

Organization

<String>

Angabe zum Antragsteller: Firma

OrganizationalUnit

<String>

Angabe zum Antragsteller: Abteilung

Locality

<String>

Angabe zum Antragsteller: Ort

State

<String>

Angabe zum Antragsteller: Bundesland

Country

<String>

Angabe zum Antragsteller: Land

Email

<String>

Angabe zum Antragsteller: Mailadresse

KeyLength

2048, 4096

Standardwert für die Schlüssellänge. Wird durch die Auswahl einer Zertifikatvorlage durch deren Wert zu Laufzeit überschrieben.

KeyExportable

true, false

Export-Markierung des Private Keys. Wird durch Vorgaben der Zertifikatvorlage überschrieben. Der Wert true ist Voraussetzung, um eine PFX-Datei, eine P12-Datei oder eine KEY-Datei zu erstellen.

DefaultPassword<string>Hier könnt ihr euer Standardpasswort für den Schutz der Private Keys hinterlegen. Aber Achtung: Das ist eine reine Komfortfunktion, das Passwort liegt sichtbar für jeden in dieser ini-Datei!

DefaultMode

SubmitCSR, CreateCSR,CreateCSRbyList

Die GUI hat´3 Eingabeoptionen: manuell können Werte zur Erstellung eines CSR eingegeben werden. Alternativ kann ein fertiger CSR eingelesen werden. Es können aber auch mehrere Zertifikate in einem Lauf erstellt werden, wenn man die CN-List-Option wählt. Die Auswahl kann zur Laufzeit überschrieben werden.

AutoElevation

true, false

Manche Infrastrukturen verwenden die Certificate Templates mit dem Default-Security-Einstellungen. Dann haben Domain Admins die Enroll-Berechtigung. Dafür muss aber der Requestor-Prozess „als Admin“ ausgeführt werden. Mit dieser Einstellung prüft das Script, ob es elevated gestartet wurde. Ist das nicht der Fall, dann wird die UAC verwendet, um die erforderlichen Rechte anzufragen.

SaveINF

true, false

Für die Generierung eines CSR wird eine INF-Datei erstellt und an certreq.exe übergeben. Diese Datei könnt ihr speichern. Das wird normalerweise nicht benötigt.
SaveCSR

true, false

Mit dieser Option wird der CSR im Ausgabe-ZIP archiviert.
SaveRSP

true, false

Mit dieser Option wird die Antwort-Datei der CA im Ausgabe-ZIP archiviert. Das wird normalerweise nicht benötigt.
SaveCER

true, false

Mit dieser Option wird die CER-Datei mit dem Public Key im Binary-Format im Ausgabe-ZIP archiviert.
SavePFX

true, false

Mit dieser Option wird das Zertifikat im PFX-Format inkl. Private und Public Key im Ausgabe-ZIP archiviert. Das PFX wird mit dem Passwort geschützt.
SavePEM

true, false

Mit dieser Option wird die PEM-Datei mit dem Public Key im BASE64-Format im Ausgabe-ZIP archiviert.
SaveAsZIP

true, false

Werden mehrere Ausgabedateien erstellt, dann werden diese automatisch zu einem ZIP-Archiv zusammengefasst, was sich nicht abschalten lässt. Wenn ihr aber nur ein Ausgabeformat wählt (z.B. PFX), dann könnt ihr mit dieser Option das Erstellen der ZIP-Datei deaktivieren.
ExportNoDatePrefix

true, false

Jede Datei hat einen Timestamp im Dateinamen vorangestellt. Mit dieser Option kann das abgeschaltet werden.
ExportPamWithChain

true, false

Wird eine PEM-Datei erstellt und diese Option ist aktiv, dann wird in die PEM-Datei die vollständige Zertifikatkette integriert.

ExportKey

true, false

Erstellt eine KEY-Datei mit dem Private Key. Dieser wird mit dem Passwort geschützt. Dafür wird die Option openssl benötigt.

ExportKey

Unencrypted

true, false

Erstellt eine KEY-Datei mit dem Private Key. Dieser wird unverschlüsselt gespeichert. Daher sollte hier unbedingt ein 7zip auf dem ausführenden Computer installiert sein. Dann wird die KEY-Datei in einem ZIP mit dem Passwort verschlüsselt geschützt. Dafür wird die Option openssl und ein 7zip benötigt.

ExportP12

true, false

Erstellt eine P12-Datei mit dem Private Key und dem Public Key. Diese wird mit dem Passwort geschützt. Dafür wird die Option openssl benötigt.

OpenSSLpath

<String> ohne Leerzeichen

Das Verzeichnis, in dem sich die Anwendung openssl.exe befindet. Leerzeichen sind nicht erlaubt, daher bei Bedarf die 8.3-Schreibweise verwenden.

Verwendung des Tools

Programmstart

Das Script wird einfach über die PowerShell gestartet. Dafür bieten sich natürlich auch Verknüpfungen an:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Es werden eine Reihe von Abfragen im Hintergrund ausgeführt. Dabei ermittelt das Script über simple LDAP-Abfragen zu einem Domain Controller

  • Welche Certificate Templates sind im Active Directory registriert?
  • Gleichzeitig wird analysiert, für welche Zertifikatvorlagen der verwendete Benutzer-Account das Enroll-Recht besitzt
  • Und natürlich werden die dazugehörigen Enrollment-Services erkannt. Das sind dann die ausstellenden Zertifizierungsstellen.
Powershell-Script &#8222;Certificate Request Tool&#8220;

Alle Informationen werden in der GUI dargestellt. Ebenso werden Voreinstellungen aus der ini-Datei gelesen:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Erstellen eines CSR und eines Zertifikates

Auswahl eines Templates

Der Admin kann nun den Dialog von oben nach unten bearbeiten. Üblicherweise wird zuerst die Vorlage gewählt, mit welcher das Zertifikat erstellt werden soll. In meiner LAB-Umgebung habe ich mehrere Templates mit Enroll-Permission:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Wird ein passendes Template ausgewählt, dann wird auch eine Zertifizierungsstelle eingestellt. Natürlich könnte man auch einen Enrollment-Service auswählen, wenn mehrere zur Verfügung stehen. Ebenso ändert sich ggf. die Key-Length.

Angabe des Common Names

Die gelb hinterlegten Felder sind Pflichtfelder. Wird ein Pflichtfeld mit einem Wert belegt, dann ändert sich die Farbe. Nachdem das Template ausgewählt wurde, geht es mit dem CommonName weiter. Der CommonName ist das wichtigste Element für Webserver-Zertifikate. Mein Script erstellt dabei automatisch ein SAN-Zertifikat und nutzt den CommonName zusätzlich als DNS-Subject. Weitere Subject Alternative Names (SAN) können im mehrzeiligen Feld mit einem Wert je Zeile angegeben werden. Beispiele werden mit dem Schalter „show samples“ dargestellt. Ich definiere für meine Demo den CommonName test1.crashwork.global. Daraus wird automatisch der SAN DNS=test1.crashwork.global. Zusätzlich definiere ich noch den SAN DNS=test2.crashwork.global:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Weitere Felder

Im vorherigen Bild sieht man auch die vielen Antragsteller-Felder. Diese sind durch die ini-Datei mit Standardwerten vorbefüllt. Natürlich kann man die Werte vor dem Ausstellen auch anpassen. Wichtig: Die Mail-Adresse wird aus dem Active Directory ausgelesen. So sieht man im Zertifikat direkt, wer es ausgestellt hat. Das kann nützlich bei späteren Zertifikaterneuerungen sein. Ebenso könnte diese Adresse genutzt werden, um den passenden Kollegen über ein ablaufendes Zertifikat automatisch zu informieren:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Die Schlüssellänge ist durch die Auswahl des Templates vorbefüllt und kann beibehalten oder ggf. vergrößert werden. Eine Verringerung ist nicht möglich und wird von der Zertifizierungsstelle abgelehnt werden. Wenn der Private Key exportiert werden soll (PFX, P12 oder KEY), dann wird für den Schutz ein Passwort benötigt. Dieses muss 2x angegeben werden.

Ausstellen und Signieren eines Zertifikates

Wenn alle Werte angegeben wurden, dann wird der Schalter „issue Certificate“ freigeschaltet:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Der Prozess der Ausstellung des Zertifikates kann einige Sekunden in Anspruch nehmen und wird im Status des Programms dargestellt. Folgende Aktionen werden ausgeführt:

  1. Das Script wird für den Request im Unterverzeichnis Certificates ein Arbeitsverzeichnis erstellen.
  2. Dann werden die Felder der GUI ausgelesen und es wird eine ini-Datei für den Request erstellt.
  3. Die ini-Datei wird an certreq.exe übergeben. Diese Anwendung erstellt daraus einen Certificate Signing Request. Dabei werden die asymmetrischen Schlüssel (Private Key und Public Key) erzeugt, der Public Key wird extrahiert, mit den Zusatzinformationen der ini-Datei versehen und codiert in einer CSR-Datei gespeichert.
  4. Danach wird certreq.exe verwendet, um den CSR an die angegebene Zertifizierungsstelle zu übergeben.
  5. Wenn Schritt 4 erfolgreich war, wird certreq.exe verwendet, um den Signing Response von der Zertifizierungsstelle abzuholen. Der Response ist der Public Key mit den Antragstellerinformationen zusammen. Beides ist wiederum digital von der CA signiert. Bei diesem Schritt wird der digital signierte Public Key wieder mit dem Private Key auf dem Computer vereinigt. Jetzt hat der aktuelle Computer das Zertifikat in seinem lokalen Speicher gebrauchsfertig. Wenn die Option KeyExportable nicht gewählt wurde, dann geht es im Schritt 8 weiter.
  6. Ansonsten wird das Zertifikat aus dem lokalen Computer in eine PFX-Datei im Arbeitsverzeichnis gespeichert. Dabei wird das eingegebene Passwort verwendet.
  7. Anschließend wird geprüft, ob auf dem Computer openssl.exe installiert wurde und ob in der ini-Datei die Konvertierung in eine PEM, eine KEY oder eine P12-Datei gewählt wurde. Ist das der Fall, dann wird openssl.exe einmal für die Extrahierung des Public Keys aus der PFX verwendet. Dabei wird eine PEM-Datei erstellt. In einem weiteren Lauf wird der Private Key aus der PFX extrahiert. Dabei wird das Passwort zum Auslesen aus der PFX und für die Encryption der KEY-Datei verwendet. Und ebenso gibt es eine Option zum Export einer P12-Datei.
  8. Die Dateien im Arbeitsverzeichnis werden in einem ZIP-Archiv komprimiert. Die ZIP-Datei wird im Unterverzeichnis Certificates erstellt und beinhaltet das Datum und die Uhrzeit im ISO-Format sowie den CommonName.
  9. Das Arbeitsverzeichnis wird gelöscht.

Der Benutzer kann den Prozess in der Statuszeile verfolgen. Danach wird das Ergebnis angezeigt:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Ausgabedateien

Powershell-Script &#8222;Certificate Request Tool&#8220;

Anschließend wird die ZIP-Datei im Windows Explorer automatisch geöffnet. Hier befinden sich die vorher aufgezählten Dateien. In meinem Beispiel war keine Konvertierung in eine PEM- und eine KEY-Datei möglich, weil ich noch kein openssl.exe installiert hatte:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Die CER-Datei und die PEM-Datei mit dem Public Key entsprechen meinen Erwartungen. Die beiden SAN-Einträge (einer ist ja automatisch gleich dem CommonName erstellt worden) sind dabei. Ebenso enthält die PEM-Datei mehrere Zertifikate, da ich ja die Kette exportieren wollte:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Integrierte Nutzung von openssl.exe

Mit openssl.exe wird die Funktionalität noch einmal erweitert. Ich habe mir die erforderlichen Dateien unter in einem Unterverzeichnis abgelegt:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Danach kontrolliere ich noch einmal den in der ini-Datei hinterlegten Pfad. Hier sind keine Leerzeichen erlaubt:

Powershell-Script &#8222;Certificate Request Tool&#8220;

So ausgestattet starte ich einen neuen Request mit meinem Script. Dieses mal nutze ich alle Export-Optionen:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Achtung: Ist die Option „save KEY plain“ gewählt, dann wird der Private Key in einer Textdatei ungeschützt liegen! Daher sucht mein Script nach einem installierten 7zip, denn mit diesem kann ich ein verschlüsseltes ZIP für den Schutz der KEY-Datei erstellen. Ist kein 7zip vorhanden, wird diese Warnung angezeigt:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Der Prozess läuft fehlerfrei und schnell durch.

Powershell-Script &#8222;Certificate Request Tool&#8220;

Nach dem Abschluss wird der Inhalt der Zip-Datei angezeigt. Da ich vor dem Ausstellen des Zertifikates 7zip installiert habe, ist das Archiv verschlüsselt:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Der Private Key in der KEY-Datei wurde mit dem angegebenen Passwort verschlüsselt, die andere KEY-File ist nicht verschlüsselt:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Ausstellung eines Zertifikates mit einem CSR

Manchmal müssen wir das Schlüsselpaar nicht selber erzeugen. Dann wird das vom Zielgerät oder dem Zielservice vorgenommen. In diesem Fall erhalten wir einen Certificate Signing Request (CSR), der alle Angaben zum Verwender inklusive dem Public Key enthält. Solche Dateien sind BASE64-kodiert und lassen sich mit Notepad öffnen:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Mein Script hat für den Import 2 Schalter. In diesem Modus werden alle Felder ausgeblendet, die jetzt nicht benötigt werden. Üblicherweise kennen Drittsysteme unsere Zertifikatvorlagen nicht. Daher muss die Vorlage noch ausgewählt werden. Danach kann dann entweder der BASE64-Text reinkopiert werden oder man ließt ihn über einen OpenDialog aus einer Datei ein:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Weil beim CSR nur der Public Key enthalten ist, können auch nicht alle Ausgabeformate gewählt werden. Das Ergebnis kommt recht schnell:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Ausstellen von mehreren Zertifikaten mit der CN-Liste

In diesem Modus kann das Script mehrere Zertifikate mit unterschiedlichen CommonNames am Stück erzeugen. Diese werden einfach im Textfeld untereinander eingegeben. Das Passwort wird für alle verwendet. Wird nur eine Ausgabeoption verwendet, dann kann auf das ZIP verzichtet werden:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Die Ergebnisdateien liegen dann im Ausgabeverzeichnis:

Powershell-Script &#8222;Certificate Request Tool&#8220;

Zusammenfassung

Das Script stelle ich euch gerne zur Verfügung. Sollten Fehler auftreten, dann kontaktiert mich gerne und ich prüfe deren Behebung.

Hier könnt ihr euch das Script in der aktuellsten Version auf meinem Gitlab-Server herunterladen: https://gitlab.ws-its.de/stephan/ps-certificaterequesttool

Kommentar hinterlassen