Ich benötige häufiger Zertifikate für Webserver und AD-Benutzer. Diese Zertifikate werden über eine Windows Zertifizierungsstelle erstellt und genutzt, über die Active Directory erfolgt auch eine Verteilung der Stamm-Zertifikate. Die Zertifikate werden sowohl für Windows- als auch für Linux-Systeme benötigt, hinzu kommen diverse Appliances wie Firewalls, Router, Switches usw…
Damit die Erstellung möglichst einfach ist, habe ich nach einer Möglichkeit gesucht, wie die Erstellung möglichst automatisiert werden kann. Sprich: Windows PowerShell.
Die genutzten Skripte
Damit die Pflege der Skripte möglichst einfach und nachvollziehbar ist, habe ich diese in mein Github-Konto gepackt:
Github.com/Kakinger/Automate Certificate Creation
Abhängigkeiten
Webserver-Zertifikate
Damit die Erstellung von Webserver-Zertifikaten möglich ist, müssen die folgenden Abhängigkeiten erfüllt sein:
Request-Certificate.ps1
Die Erstellung passiert grundsätzlich über das Skript Request-Certificate.ps1 von Jonas, ein MVP-Kollege aus der Schweiz von der itnetX. Das Skript ist verfügbar über die folgenden Quellen:
https://gallery.technet.microsoft.com/scriptcenter/Request-certificates-from-b6a07151
https://github.com/J0F3/PowerShell
webserver.json
Die Datei webserver.json beschreibt, welche Namen und IP-Adressen in dem Zertifikat enthalten sein sollen.
Die Datei kann beliebig erweitert werden um weitere Namen und IP-Adressen. Da json sehr anfällig ist, muss das Format hier sehr genau eingehalten werden, sonst gibt es eine Fehlermeldung beim Aufruf des Skripts. Meine beliebteste Fehlerquelle: Das abschließende Komma drin gelassen…
CreateWebserverCertificate.ps1
Mit diesem Zertifikat kann das eigene Zertifikat letztendlich erstellt werden. Das Skript hat ein paar Abhängigkeiten oder Pfade, hier eine kurze Beschreibung zur Hilfe.
$Sourcefile
Dieser Parameter gibt den Pfad zur webserver.json-Datei an.
$CATemplate
Hier muss der Name der Zertifikatsvorlage eingetragen werden.
$CAName
Dies ist der Name der Zertifizierungsstelle. Der Name setzt sich zusammen aus dem Computername (FQDN) und dem Namen der Zertifizierungsstelle.
$PFX, $outCER, $outPEM und $outKEY
Diese Parameter geben an, an welchen Ort die fertigen Zertifikate exportiert werden. Dieser Pfad steht bei mir auf C:\cert.
Die Funktion Create-opensslcertificates
Damit das Skript Zertifikate als .PEM und .KEY auswirft, nutze ich OpenSSL für Windows. Falls die Software nicht installiert ist, funktioniert die Konvertierung in diese Dateitypen nicht. Innerhalb der Funktion muss der Pfad zur Datei openssl.exe angegeben werden, ich nutze hier den Standardpfad.
Benutzer-Zertifikate
Request-Certificate.ps1
Die Erstellung passiert grundsätzlich über das Skript Request-Certificate.ps1 von Jonas, ein MVP-Kollege aus der Schweiz von der itnetX. Das Skript ist verfügbar über die folgenden Quellen:
https://gallery.technet.microsoft.com/scriptcenter/Request-certificates-from-b6a07151
https://github.com/J0F3/PowerShell
user.json
In dieser Datei wird der Pfad zu dem Benutzer-Element in der Active Directory angegeben. Falls der Pfad nicht bekannt ist oder die Suche zu aufwendig ist, kann der Pfad über den folgenden Befehl ausgegeben werden:
Get-ADUser -Identity ChewDavid -Properties DistinguishedName
Siehe dazu auch die Hilfe von Microsoft: https://docs.microsoft.com/en-us/powershell/module/addsadministration/get-aduser?view=win10-ps
CreateUserCertificate.ps1
Auch hier gibt es ein paar Dinge, die beachtet werden sollten bzw. angepasst werden können.
$Sourcefile
Dieser Parameter zeigt auf die user.json-Datei. Diese liegt bei mir unter C:\tools.
$CATemplate
Hier muss der Name der Zertifikatsvorlage eingetragen werden.
$CAName
Dies ist der Name der Zertifizierungsstelle. Der Name setzt sich zusammen aus dem Computername (FQDN) und dem Namen der Zertifizierungsstelle.
Wie das Skript arbeitet
Sind im Skript keine Fehler und die Abhängigkeiten sind alle erfüllt, wird innerhalb von wenigen Sekunden ein neues Benutzer und/oder Webserver-Zertifikat erstellt.
Die Computerkontextvorlage steht im Konflikt mit dem Benutzerkontext
Bei der Erstellung von dem Benutzer-Zertifikat wird eine Warnung ausgeworfen mit dem Text „Die Computerkontextvorlage steht im Konflikt mit dem Benutzerkontext“. Warum dies ist habe ich nicht weiter verfolgt, aber wenn man auf diese Seite kommt wegen der Suche nach dieser Warnung, dann wird es vermutlich deswegen sein, weil ich der einzige Treffer bin mit diesem Text 😉
Hallo Jan,
beim ausführen kommt folgende Fehlermeldung, die acl passt:
requestting san certificate with subject..
active directory enrollment policy
{23456..}
ldap:
Certificate Request Processor: Provider type not defined. 0x80090017 (-2146893801 NTE_PROV_TYPE_NOT_DEF)
Hallo Dani,
schau mal bitte nach, ob auf dem System der „CNG Key Isolation“ Dienst läuft. Falls nicht, den bitte einmal starten und nochmal probieren.
Gruß, Jan
Hallo Jan,
danke für den Tipp. Nein die habe ich geprüft, das wars leider nicht. Im schweizer ps script stand 2048, den wert habe ich auf 4096 angepasst. Jetzt ist der eine Fehler weg dafür habe ich den neuen , nachdem write host „certreq: request created“ meldet. Prompted certificate request processor: The handle is invalid. 0x80070006 (WIN32: 6 ERROR_INVALID_HANDLE) submit commanc failed. Hast Du eine Idee woran das liegen kann? Da hat Microsoft sich wieder tolles Einfallen lassen, das war so easy mit dem IIS Service vorher… Vor allem weil jetzt Browser auch noch auf 1-jährig wollen… eieieie, Danke Dir!