Zertifikate mit PowerShell analysieren: ThumbPrint, Ablaufdatum, Aussteller, Private Key, Hash-Algorithmus

    Zertifikate mit PowerShell verwaltenZertif­ikate sind zweifel­los eine kri­tische Kompo­nente der IT-Infra­struktur. Laufen sie ab, dann kann dies zum Aus­fall von Diensten führen. Wurden sie mit einem schwachen Hash-Algo­rithmus signiert, stellen sie ein Sicher­heits­risiko dar. Diese und andere Infor­ma­tionen lassen sich mit PowerShell effizient aus­lesen.

    Das Zertifikat-Snapin für MMC oder der IIS-Manager sind komfortable Tools, um etwa ein neues Zertifikat anzufordern oder einer Website zuzu­ordnen. Für die Analyse aller Zertifikate anhand ver­schiedener Kriterien sind diese GUI-Werk­zeuge jedoch zu umständlich, wenn man das Kontext­menü eines jeden einzelnen Zertifikats öffnen muss, um wesentliche Infor­mationen zu erhalten.

    Zertifikatspeicher als Laufwerk ansprechen

    Wie etwa auch beim Reporting für das Active Directory erweist sich PowerShell auch beim Management der Zertifikate als überlegen. Damit lässt sich der gesamte Store ohne großen Aufwand durch­suchen und man kann dann Zertifikate anhand bestimmter Kriterien filtern.

    Die hierarchische Struktur des Zertifikatspeichers lässt sich in PowerShell wie ein Laufwerk ansprechen.

    Die Parallele mit dem Active Directory trifft auch insofern zu, als der Zugriff auf den Zertifikat­speicher ebenfalls erfolgt, indem dieser als Laufwerk gemountet wird (siehe dazu: Active Directory in PowerShell als Laufwerk mounten und Objekte bearbeiten).

    PowerShell bringt zu diesem Zweck einen eigenen Provider mit, wie man mit

    Get-PSProvider

    leicht feststellen kann.

    Der Provider für den Zertifikatspeicher zeigt sich erst, nachdem man nach cert:\ wechselt.

    In einer frisch geöffneten PowerShell-Sitzung wird sich der Provider mit dem Namen Certificate allerdings nicht zeigen. Das passiert erst, nachdem man das Modul PKI importiert hat, oder einfacher durch Autoloading, wenn man nach

    cd cert:\

    wechselt.

    Im Speicher navigieren, neue Speicher anlegen

    Von dort kann man mit den Cmdlets, die man sonst für das Navigieren im Dateisystem nutzt, den Zertifikat­speicher durchlaufen und auslesen. Um sich in der Baumstruktur zu bewegen, verwendet man somit Set-Location (Alias cd), und New-Item (Alias md), um eine neue Store-Location anzulegen:

    New-Item -Path Cert:\LocalMachine\Test

    Remove-Item (rd) löscht eine solche wieder.

    Um die Zertifikate in einem Store anzuzeigen, verwendet man Get-ChildItem (Alias gci, dir oder ls). Seine Standard­ausgabe enthält den Antragsteller (Subject) und den Thumbprint.

    Get-ChildItem gibt im cert-Kontext standardmäßig den Antragsteller und den Fingerabdruck aus.

    Zusätzliche Parameter für Get-ChildItem

    Interessant dabei ist, dass das Cmdlet im Kontext des Cert-Laufwerks andere Parameter als im Dateisystem unter­stützt, wie man mit diesem Befehl heraus­finden kann:

    Get-Command  Get-ChildItem | foreach{$_.Parameters.Keys}

    Darunter finden sich solche für das Filtern von Zertifikaten, wie

    • CodeSigningCert
    • DocumentEncryptionCert
    • SSLServerAuthentication
    • DnsName
    • Eku
    • ExpiringInDays

    Damit ließen sich zum Beispiel alle Zertifikate anzeigen, die innerhalb eines Jahres ablaufen:

    gci cert:\ -recurse -ExpiringInDays 365

    Alle Zertifikate mit einer bestimmten verbleibenden Gültigkeit anzeigen

    Die Parameter Code­Signing­Cert, Document­Encryption­Cert und SSL­Server­Authentication filtern Zertifikate danach, ob sie sich für das Signieren von Code, das Verschlüsseln von Dokumenten oder für die SSL-Authentifizierung eignen.

    Eigenschaften und Methoden von Zertifikat-Objekten

    Zahlreiche weitere Eigenschaften lassen sich nicht auf diesem Weg, sondern nur als Attribute von Objekten des Typs

    System.Security.Cryptography.X509Certificates.X509Certificate2

    ansprechen. Ein solches erhält man im Kontext des cert-Laufwerks als Ergebnis von Get-ChildItem.

    dir | ? Thumbprint -eq 0123456789 | Get-Member

    Dieser Aufruf gibt mit Hilfe von Get-Member eine stattliche Liste von Methoden und Eigenschaften aus, über die ein Zertifikat-Objekt verfügt.

    Methoden von Zertifikat-Objekten in PowerShell

    Damit ließen sich etwa das Ausstellungs- und Ablaufdatum ausgeben:

    gci | select FriendlyName, NotAfter, NotBefore

    Dieser Befehl listet alle Zertifikate im aktuellen Store auf und listet den Anzeigename, das Ablaufdatum (NotAfter) und das Datum auf, ab dem die Zertifikate gültig sind.

    Aussteller anzeigen

    Zu den Eigenschaften, die man auf diesem Weg abfragen kann, zählt auch der Aussteller. Mit Hilfe dieses Kommandos könnte man etwa feststellen, ob sich im Speicher ein (problematisches) Zertifikat von Symantec befindet:

    gci -Recurse cert:\ | ? Issuer -like "*Symantec*"

    Private und Public Key

    Bei SSL-Zertifikaten ist es erforderlich, dass diese den privaten Schlüssel enthalten. Ob dies der Fall ist, lässt sich so erfragen:

    gci | select FriendlyName, HasPrivateKey

    Dieser Befehl würde für alle Zertifikate im aktuellen Store den Namen anzeigen und zudem Auskunft geben, ob sie einen privaten Schlüssel enthalten.

    Anzeigen, ob Zertifikate einen privaten Schlüssel enthalten

    Oft will man dann noch wissen, ob der Private Key exportierbar ist:

    gci | foreach($_) { if($_.HasPrivateKey){
      $_.Subject; $_.PrivateKey.CspKeyContainerInfo.Exportable}
    }

    Dieses Kommando leitet die Ausgabe von Get-ChildItem an eine foreach-Schleife weiter und prüft für jedes Zertifikat, ob es einen privaten Schlüssel enthält. Trifft dies zu, dann gibt es die Eigenschaft Exportable aus. In der Praxis funktioniert dieses Vorgehen aber nicht bei allen Zertifikaten, dieser Blog-Beitrag auf TechNet zeigt ein alternatives Verfahren.

    Analog dazu könnte man den öffentlichen Schlüssel als String so auslesen:

    Get-ChildItem | %($_) { $_.Subject, $_.GetPublicKeyString()}

    Mit SHA-1 signierte Zertifikate finden

    Die meisten Browser werden in absehbarer Zeit solche Zertifikate als ungültig abweisen, bei denen der Finger­abdruck mit dem Algorithmus SHA-1 erstellt wurde. Bei Google Chrome ist das bereits jetzt der Fall.

    Daher kann es von Interesse sein, SSL-Zertifikate auf diese Eigenschaft zu prüfen. Zuständig ist dafür ist die Eigenschaft SignatureAlgorithm:

    gci -Recurse | ? {$_.SignatureAlgorithm.FriendlyName -eq "sha1RSA"}

    Anzeigen aller Zertifikate, die mit SHA-1 signiert wurden.

    Mit diesem Befehl ließen sich alle Zertifikate im Store ermitteln, die mit dem unsicheren Algorithmus signiert wurden.

    Keine Kommentare