Inhaltsverzeichnis
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.

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:

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

Das sind die Werte im Detail
| Eigenschaft | gültige Werte | Beschreibung |
|---|---|---|
| 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 |
|
|
<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:

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.

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

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:

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:

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:

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:

Der Prozess der Ausstellung des Zertifikates kann einige Sekunden in Anspruch nehmen und wird im Status des Programms dargestellt. Folgende Aktionen werden ausgeführt:
- Das Script wird für den Request im Unterverzeichnis Certificates ein Arbeitsverzeichnis erstellen.
- Dann werden die Felder der GUI ausgelesen und es wird eine ini-Datei für den Request erstellt.
- 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.
- Danach wird certreq.exe verwendet, um den CSR an die angegebene Zertifizierungsstelle zu übergeben.
- 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.
- Ansonsten wird das Zertifikat aus dem lokalen Computer in eine PFX-Datei im Arbeitsverzeichnis gespeichert. Dabei wird das eingegebene Passwort verwendet.
- 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.
- 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.
- Das Arbeitsverzeichnis wird gelöscht.
Der Benutzer kann den Prozess in der Statuszeile verfolgen. Danach wird das Ergebnis angezeigt:

Ausgabedateien

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:

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:

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:

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

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

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:

Der Prozess läuft fehlerfrei und schnell durch.

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:

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

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:

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:

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

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:

Die Ergebnisdateien liegen dann im Ausgabeverzeichnis:

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