Tags: Zertifikate, PowerShell
Zertifikate sind zweifellos eine kritische Komponente der IT-Infrastruktur. Laufen sie ab, dann kann dies zum Ausfall von Diensten führen. Wurden sie mit einem schwachen Hash-Algorithmus signiert, stellen sie ein Sicherheitsrisiko dar. Diese und andere Informationen lassen sich mit PowerShell effizient auslesen.
Das Zertifikat-Snapin für MMC oder der IIS-Manager sind komfortable Tools, um etwa ein neues Zertifikat anzufordern oder einer Website zuzuordnen. Für die Analyse aller Zertifikate anhand verschiedener Kriterien sind diese GUI-Werkzeuge jedoch zu umständlich, wenn man das Kontextmenü eines jeden einzelnen Zertifikats öffnen muss, um wesentliche Informationen 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 durchsuchen und man kann dann Zertifikate anhand bestimmter Kriterien filtern.
Die Parallele mit dem Active Directory trifft auch insofern zu, als der Zugriff auf den Zertifikatspeicher 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.
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 Zertifikatspeicher 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 Standardausgabe enthält den Antragsteller (Subject) und den Thumbprint.
Zusätzliche Parameter für Get-ChildItem
Interessant dabei ist, dass das Cmdlet im Kontext des Cert-Laufwerks andere Parameter als im Dateisystem unterstützt, wie man mit diesem Befehl herausfinden 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
Die Parameter CodeSigningCert, DocumentEncryptionCert und SSLServerAuthentication 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.
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.
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. Dann kann man sich alternativ mit dem Dienstprogramm certutil behelfen:
certutil.exe -store my
Dieser Befehl zeigt alle Zertifikate im Speicher unter Eigene Zertifikate an und gibt eine Warnung aus, wenn ein privater Schlüssel nicht exportierbar ist.
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 Fingerabdruck 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"}
Mit diesem Befehl ließen sich alle Zertifikate im Store ermitteln, die mit dem unsicheren Algorithmus signiert wurden.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Lets Encrypt-Zertifikat mit ACME2-Client ausstellen, installieren, automatisch erneuern
- Alle Windows-Server auf ablaufende Zertifikate prüfen mit PowerShell
- (Selbstsignierte) Zertifikate über Gruppenrichtlinien oder PowerShell importieren
- Get-Certificate: SSL-Zertifikat mit PowerShell anfordern
- PowerShell Remoting über HTTPS mit einem selbstsignierten SSL-Zertifikat
Weitere Links