Tags: PowerShell, Zertifikate, Active Directory
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.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Windows-Zertifizierungsstelle außer Betrieb nehmen
- Split-brain DNS in Active Directory einrichten
- AD-Konten mit DES- und RC4-Algorithmus für Kerberos-Verschlüsselung finden
- UserAccountControl: Sicherheitseinstellungen für AD-Konten prüfen und ändern
- Gruppen in Azure Active Directory mit PowerShell verwalten
Weitere Links
2 Kommentare
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
Hallo und erstmal danke für die Anleitung.
Ich habe damit per Powershell erfolgreich ein neues Zertifikat ausstellen können.
Da ich das Zertifikat jedoch auch mit dem privaten Schlüssel exportieren muss, habe ich das direkt im Anschluss probiert und es ist bei mir nicht aus gegraut.
Die Aussage stimmt daher so pauschal nicht, ich vermute die benutzte Vorlage müsste vorher noch angepasst werden (Anforderungsverarbeitung-->Exportieren von privatem Schlüssel zulassen), sodass der private Schlüssel immer direkt exportierbar ist?
Grüße Kevin