Get-Certificate: SSL-Zertifikat mit PowerShell anfordern


    Tags: , ,

    Zertifikate mit PowerShell verwaltenNeben den gängigen GUI- und CLI-Tools ist unter den Bord­mitteln von Windows auch Power­Shell in der Lage, die Aus­stellung eines Zertifikats anzu­fordern. Das dafür zuständige Cmdlet weist zwar einige Ein­schränkungen auf, eignet sich aber zum Beispiel dazu, ein SSL-Zertifikat von einer internen CA aus­stellen zu lassen.

    PowerShell bietet eine Reihe von Mitteln, mit denen man den Zertifikat­speicher verwalten und Zertifikate unter­suchen kann (siehe dazu Zertifikate mit PowerShell analysieren: ThumbPrint, Ablaufdatum, Aussteller, Private Key, Hash-Algorithmus). Außerdem stellt sie ein Cmdlet für die Generierung selbst­signierter Zertifikate zur Verfügung.

    Optionen von Get-Certificate

    Wenn es jedoch um das Anfordern von Zertifikaten geht, dann sind die Möglich­keiten 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 über­schaubaren Zahl an Optionen hält das Cmdlet einige Stolper­steine bereit, nicht zuletzt wegen der unzureichenden Dokumen­tation.

    Name des Antragstellers

    Den Namen des Antragstellers spezifiziert man über den Parameter SubjectName. Während man im MMC-Snap-in hier die einzelnen Namens­bestandteile wie Land, Organisation oder Domäne einzeln eingeben und den Distinguished Name erzeugen lassen kann, muss man diesen hier selbst bereit­stellen. 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

    Der Parameter SubjectName erfordert einen Distinguished Name

    Ü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 Zertifikats­vorlage, 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}

    Zertifikatsvorlagen anzeigen mit PowerShells Get-CATemplate

    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

    Das Anfordern eines Zertifikats kann an fehlenden Rechten auf die Vorlage scheitern.

    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.

    Der Rechner, welcher das Zertifikat anfordert, muss die nötigen Rechte auf die Vorlage erhalten.

    Schließlich gibt man noch über CertStoreLocation den Pfad zum Zertifikat­speicher an (üblicherweise "Cert:\LocalMachine\My") und die URL zur Zertifizierungs­stelle 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:

    Erfolgreicher Aufruf von Get-Certificate

    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.

    Der private Schlüssel von Zertifikaten, die mit Get-Certificate angefordert werden, lässt sich nicht exportieren.

    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

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut
    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Verwandte Beiträge

    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