Wie programmiere ich den Zugriff auf den Windows-Zertifikatspeicher mit PowerShell?
- Zertifikatspeicher öffenen und auslesen mit .NET
- Zertifikatspeicher mit PowerShell-Cmdlets nutzen
- Zertifikate hinzufügen und entfernen
- Zugriffsrechte und Sicherheit
- Zusammenfassung
Der Zugriff auf den Windows-Zertifikatspeicher kann mit PowerShell auf verschiedene Arten erfolgen, vor allem unter Verwendung des .NET-Frameworks und der integrierten PowerShell-Cmdlets. Grundsätzlich stellt Windows mehrere Zertifikatspeicher bereit, wie beispielsweise "CurrentUser" (Zertifikate des aktuell angemeldeten Benutzers) und "LocalMachine" (Zertifikate, die für den gesamten Computer gelten). Die gängigsten Speicherorte sind "My" (auch Persönlich genannt), "Root" (Vertrauenswürdige Stammzertifizierungsstellen) oder "TrustedPeople".
Zertifikatspeicher öffenen und auslesen mit .NET
PowerShell verfügt über direkten Zugriff auf das .NET-Framework, das eine Klasse namens System.Security.Cryptography.X509Certificates.X509Store bereitstellt. Diese Klasse ermöglicht das Öffnen und Auslesen von Zertifikatspeichern. Um beispielsweise alle Zertifikate des "CurrentUser\My"-Speichers auszulesen, kann folgender Code verwendet werden:
# Zertifikatspeicher "My" im Kontext "CurrentUser" öffnen$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My", "CurrentUser")$store.Open( ::ReadOnly)# Alle Zertifikate im Speicher ausgebenforeach ($cert in $store.Certificates) { Write-Output "Subject: $($cert.Subject)" Write-Output "Issuer: $($cert.Issuer)" Write-Output "Gültig von: $($cert.NotBefore) bis $($cert.NotAfter)" Write-Output "Thumbprint: $($cert.Thumbprint)" Write-Output "----------------------------"}# Speicher wieder schließen$store.Close()Der vorherige Code öffnet den Zertifikatspeicher im Lesemodus, listet die wichtigsten Informationen aller enthaltenen Zertifikate auf und schließt den Speicher anschließend wieder. Dabei sind Eigenschaften wie Subject (Name des Zertifikatsinhabers), Issuer (Aussteller), Gültigkeitszeitraum und Thumbprint (ein eindeutiger Fingerabdruck) von Interesse.
Zertifikatspeicher mit PowerShell-Cmdlets nutzen
Ab PowerShell Version 5.1 sind spezielle Cmdlets zum Umgang mit Zertifikaten verfügbar, die das Arbeiten erleichtern. Diese arbeiten über das sogenannte PSDrive Cert: mit dem Zertifikatspeicher als virtuellem Dateisystem. So kann man beispielsweise mit dem Befehl:
Get-ChildItem -Path Cert:\CurrentUser\Myalle Zertifikate aus dem "My"-Speicher des aktuellen Benutzers auslesen. Die Ausgabe enthält standardmäßig die wichtigsten Details der Zertifikate.
Diese Methode ist sehr einfach und kann auch verwendet werden, um gezielt nach bestimmten Zertifikaten zu suchen. Ein Beispiel:
Get-ChildItem -Path Cert:\LocalMachine\Root | Where-Object { $_.Subject -like "*Microsoft*" }Jetzt werden alle Stammzertifikate unter dem lokalen Computer herausgefiltert, deren Betreff das Wort "Microsoft" enthält.
Zertifikate hinzufügen und entfernen
Mit PowerShell und der .NET-Klasse können auch Zertifikate importiert oder entfernt werden. Zum Import einer PFX-Datei beispielsweise kann folgender Ansatz genutzt werden:
$pfxPath = "C:\Pfad\zum\Zertifikat.pfx"$password = ConvertTo-SecureString -String "IhrPasswort" -AsPlainText -Force$pfx = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2$pfx.Import($pfxPath, $password, ::PersistKeySet)
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My","CurrentUser")$store.Open( ::ReadWrite)$store.Add($pfx)$store.Close()$pfx.Import($pfxPath, $password, ::PersistKeySet)
Hier wird das Zertifikat inklusive privatem Schlüssel aus der PFX-Datei importiert und im persönlichen Zertifikatspeicher des aktuellen Benutzers abgelegt.
Zum Entfernen eines Zertifikats kann man ähnlich vorgehen. Man sucht gezielt das zu entfernende Zertifikat, zum Beispiel anhand des Thumbprints, und entfernt es dann:
$thumbprint = "ABCDEF1234567890..."$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My","CurrentUser")$store.Open( ::ReadWrite)$cert = $store.Certificates | Where-Object { $_.Thumbprint -eq $thumbprint }if ($cert) { $store.Remove($cert)}$store.Close()Zugriffsrechte und Sicherheit
Beim Zugriff auf den Zertifikatspeicher, insbesondere beim Schreiben (Importieren, Löschen), sind entsprechende Zugriffsrechte erforderlich. Beim Zugriff auf LocalMachine-Speicher ist häufig eine erhöhte PowerShell-Konsole (als Administrator) nötig, da hier Zertifikate für den gesamten Computer verwaltet werden. Für CurrentUser genügt in der Regel der normale Benutzerkontext.
Außerdem sollten sensible Daten wie private Schlüssel mit Bedacht behandelt werden. Das obige Beispiel zeigt, wie ein Passwort als SecureString übergeben wird, um die Sicherheit zu erhöhen.
Zusammenfassung
Zusammenfassend gibt es zwei wesentliche Wege, um in PowerShell auf den Windows-Zertifikatspeicher zuzugreifen: Entweder über die .NET-Klassen X509Store und X509Certificate2 oder über das PowerShell-eigene PSDrive Cert:. Beide Methoden erlauben das Auslesen und Verwalten von Zertifikaten. Beim Ändern von Zertifikaten sind entsprechende Rechte notwendig.
So können Sie Programmatisch Zertifikate auslesen, filtern, importieren und löschen – und damit zum Beispiel Automatisierungen rund um die Verwaltung von SSL-Zertifikaten, Authentifizierung oder Signaturen in Ihrer Umgebung realisieren.
