Get-Certificate: SSL-Zertifikat mit PowerShell anfordern
Neben den gängigen GUI- und CLI-Tools ist unter den Bordmitteln von Windows auch PowerShell in der Lage, die Ausstellung eines Zertifikats anzufordern. Das dafür zuständige Cmdlet weist zwar einige Einschränkungen auf, eignet sich aber zum Beispiel dazu, ein SSL-Zertifikat von einer internen CA ausstellen zu lassen.
PowerShell bietet eine Reihe von Mitteln, mit denen man den Zertifikatspeicher verwalten und Zertifikate untersuchen kann (siehe dazu Zertifikate mit PowerShell analysieren: ThumbPrint, Ablaufdatum, Aussteller, Private Key, Hash-Algorithmus). Außerdem stellt sie ein Cmdlet für die Generierung selbstsignierter Zertifikate zur Verfügung.
Optionen von Get-Certificate
Wenn es jedoch um das Anfordern von Zertifikaten geht, dann sind die Möglichkeiten von PowerShell eher begrenzt. Zuständig ist dafür Get-Certificate, das mit Windows 8 und Server 2012 eingeführt wurde.
Es unterstützt für diese Aufgabe 6 Parameter, mit denen sich die wichtigsten Angaben für einen Request übermitteln lassen. Trotz der überschaubaren Zahl an Optionen hält das Cmdlet einige Stolpersteine bereit, nicht zuletzt wegen der unzureichenden Dokumentation.
Name des Antragstellers
Den Namen des Antragstellers spezifiziert man über den Parameter SubjectName. Während man im MMC-Snap-in hier die einzelnen Namensbestandteile wie Land, Organisation oder Domäne einzeln eingeben und den Distinguished Name erzeugen lassen kann, muss man diesen hier selbst bereitstellen. Verwendet man für den SubjectName ein anderes Format, dann erhält man diesen Fehler:
Get-Certificate : CertEnroll::CX500DistinguishedName::Encode: Die Zeichenfolge enthält einen ungültigen Schlüssel, OID, Wert oder Trennzeichen für das X500-Namensattribut. 0x80092023
Über DnsName definiert man Subject Alternative Names, entweder in Form eines FQDN oder Hostname, wobei man die Namen durch Komma trennt.
Über Template spezifiziert man die Zertifikatsvorlage, die man verwenden möchte. In unserem Beispiel ist das WebServer. Die Liste der verfügbaren Templates kann man sich nach diesem Muster anzeigen lassen:
Invoke-Command -ComputerName contoso-CA-server -ScriptBlock {Get-CATemplate |
select Name}
Berechtigung auf Vorlage
Nachdem das Zertifikat vom Computer und nicht vom User angefordert wird, muss man sicherstellen, dass sein Account Zugriff auf die gewünschte Vorlage hat. Das dürfte in der Regel nicht der Fall sein und PowerShell gibt dann diese Meldung aus:
Get-Certificate : CertEnroll::CX509Enrollment::Enroll: Sie besitzen keine Berechtigung zum Anfordern dieses Typs von Zertifikat.: Die Berechtigungen auf dieser Zertifikatvorlage lassen nicht zu, dass der aktuelle Benutzer sich für diesen Zertifikattyp einschreibt. 0x80094012
Die erforderliche Berechtigung lässt sich nicht über PowerShell erteilen, vielmehr muss man dafür das MMC-Snap-in Zertifikatvorlagen bemühen. In den Eigenschaften der Vorlage wechselt man zum Reiter Sicherheit und fügt dort den Server oder besser die Gruppe hinzu, in der er enthalten ist. Er erhält dann die Rechte Lesen und Registrieren.
Schließlich gibt man noch über CertStoreLocation den Pfad zum Zertifikatspeicher an (üblicherweise "Cert:\LocalMachine\My") und die URL zur Zertifizierungsstelle ein. Letztere kann man mit
Get-CertificateEnrollmentPolicyServer -context Machine -Scope all
erfragen. Häufig ist das nur "ldap:", man kann aber trotzdem die CA genauer spezifizieren, und zwar in der Form
ldap:///CN=contoso-CA-server
Nun sollte dem vollständigen Aufruf des Cmdlets nichts mehr im Weg stehen:
Administrative PowerShell-Sitzung erforderlich
Auch wenn die Anforderung im Namen des Computers erfolgt, muss man dieses Kommando in einer PowerShell-Sitzung mit erhöhten Rechten ausführen. Andernfalls erhält man diesen Fehler:
Get-Certificate: CertEnroll::CX509EnrollmentPolicyActiveDirectory::GetTemplates: Zugriff verweigert 0x80070005 (WIN32: 5 ERROR_ACCESS_DENIED)
Dieser ließe sich fälschlich als Hinweis auf fehlende Rechte beim Template interpretieren, die entsprechende Meldung sieht aber aus wie weiter oben gezeigt.
Privater Schlüssel nicht exportierbar
Wenn man das neue Zertifikat über das MMC-Snap-in oder das Cmdlet Export-PfxCertificate exportieren möchte, dann wird man feststellen, dass die Option für den Export des privaten Schlüssels ausgegraut ist bzw. dass man einen Fehler erhält. Get-Certificate bietet nämlich keine Möglichkeit, diesen als exportierbar zu konfigurieren.
Da der Web-Server den Private Key jedoch benötigt, muss man das Zertifikat immer von jenem Rechner aus anfordern, auf dem es dann auch genutzt wird.
Ähnliche Beiträge
- Attribute (single- und multi-valued) im Active Directory ändern oder kopieren mit PowerShell
- Lets Encrypt-Zertifikat mit ACME2-Client ausstellen, installieren, automatisch erneuern
- Verteilergruppen für Exchange in PowerShell anlegen und verwalten
- Kontakte für Microsoft Exchange anlegen im Admin Center oder mit PowerShell
- Postfächer in Exchange (Online) mit PowerShell verwalten
Weitere Links
- Technisches Webinar zu Active Directory: Benutzerverwaltung automatisieren, Aufgaben delegieren, unerwünschte Änderungen erkennen
- Virtuelles Seminar: Active Directory absichern, auf Angriffe richtig reagieren
- Technisches Webinar: Änderungen im Active Directory erkennen, Angriffe auf das Netzwerk schnell bemerken
1 Kommentar
Was mache ich, wenn ich diesen Fehler bekomme..??
CertEnroll::CX500DistinguishedName::Encode: The string contains an invalid X500 name attribute key, oid, value or
delimiter. 0x80092023 (-2146885597 CRYPT_E_INVALID_X500_STRING)
+ CategoryInfo : NotSpecified: (:) [Get-Certificate], Exception
+ FullyQualifiedErrorId : System.Exception,Microsoft.CertificateServices.Commands.GetCertificateCommand