Verwalten von Zertifikatsspeichern mit PowerShell

  1. Verständnis des Zertifikatsspeichers
  2. Verwalten von Zertifikaten mit PowerShell
Verwalten von Zertifikatsspeichern mit PowerShell

Als Windows-Systemadministratoren wären wir möglicherweise gezwungen gewesen, mit Windows-Zertifikaten zu arbeiten. Leider ist die Arbeit mit Zertifikaten in Windows normalerweise eine der verschiedenen Aufgaben, die ein Systemadministrator übernehmen muss.

In diesem Artikel wird erläutert, wie Zertifikate abgefragt und Zertifikatsspeicher mit PowerShell verwaltet werden.

Verständnis des Zertifikatsspeichers

Zertifikatsspeicher sind “Buckets”, in denen das Windows-Betriebssystem alle derzeit installierten Zertifikate aufbewahrt. Ein Zertifikat kann in mehreren Speichern vorhanden sein und werden manchmal als physische oder logische Speicher bezeichnet. Die Registrierungsschlüssel und -dateien werden in physischen Speichern gespeichert, die auf das vorhandene Dateisystem oder den Speicherort der Registrierung verweisen.

Die Windows-Registrierung und das Dateisystem enthalten jeden Speicher. Bei der Arbeit mit einem Zertifikat interagieren wir eher mit dem logischen Speicher als mit der Registrierung oder dem Dateisystem.

Dynamische Verweise auf einen oder mehrere physische Speicher sind logische Speicher, und physische Speicher sind schwieriger zu verwalten als logische Speicher. Windows speichert Zertifikate an zwei Orten: einem Benutzerkontext und einem Computerkontext.

Je nachdem, ob das Zertifikat von einem einzelnen Benutzer, mehreren Benutzern oder der Maschine selbst verwendet werden soll, wird ein Zertifikat in einen dieser beiden Kontexte gestellt. Ein Zertifikat in einem Benutzer- oder Computerkontext wird für den Rest dieses Artikels als Benutzerzertifikate und Computerzertifikate bezeichnet.

Benutzerzertifikate

Wenn nur ein einzelner Benutzer ein Zertifikat verwenden soll, ist ein im Windows-Zertifikatsmanager gespeichertes Benutzerzertifikat ideal. Dies ist bei zertifikatbasierten Authentifizierungssystemen wie kabelgebundenem IEEE 802.1x üblich.

Benutzerzertifikate werden im Profil des aktuellen Benutzers gespeichert und können nur logisch dem Kontext dieses Benutzers zugeordnet werden. Selbst auf denselben Systemen werden Benutzerzertifikate zugeordnet und sind für jeden Benutzer eindeutig.

Computerzertifikate

Wenn alle Benutzer ein Zertifikat auf einem Computer oder einem Systemprozess verwenden, sollte es in einem Speicher im Computerkontext abgelegt werden. Wenn ein System beispielsweise ein Zertifikat auf einem Webserver verwendet, um die Kommunikation für alle Clients zu verschlüsseln, wäre es ideal, ein Zertifikat in einem Speicher im Computerkontext zu hinterlegen.

Wir werden sehen, dass der Zertifikatsspeicher eines Computers logisch für alle Benutzerkontexte abgebildet wird, und dieses Konzept ermöglicht, dass Zertifikate in einem Computerzertifikatsspeicher von allen Benutzern verwendet werden können. Es hängt jedoch immer noch von den Berechtigungen ab, die für den privaten Schlüssel konfiguriert sind.

Der Ordner Programmdaten und die Hives der Registrierung des lokalen Computers enthalten Computerzertifikate. Darüber hinaus finden wir Benutzerzertifikate im Ordner AppData und in den Hives Current User Registry.

Verwalten von Zertifikaten mit PowerShell

Wie bei der MMC können wir auch mit PowerShell Zertifikate einsehen und verwalten. Aber lassen Sie uns zuerst die Zertifikate in ihren physischen Speichern (der Registrierung und dem Dateisystem) untersuchen.

Physisches Geschäft

Wir können alle Schlüssel und Werte im übergeordneten Registrierungsschlüsselpfad HKCU:\Software\Microsoft\SystemCertificates\CA\Certificates\ mit dem PowerShell-Cmdlet Get-ChildItem aufzählen.

Der folgende Befehl listet alle Zertifikate des derzeit angemeldeten Benutzers im logischen Speicher der Zwischenzertifizierungsstellen auf.

Beispielcode:

Get-ChildItem -Path HKCU:\Software\Microsoft\SystemCertificate\CA\Certificates\

Der Fingerabdruck des Zertifikats für die vertrauenswürdige Zertifizierungsstelle und ihr Zertifikat in der entsprechenden Eigenschaft entsprechen jedem Eintrag in der Registrierungsstruktur, die wir sehen.

Ausgang:

Hive: HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\CA\Certificates

Name                           Property
----                           --------
070A726C6E4418DCF0213874F0C16D Blob : {3, 0, 0, 0...}
93B041E935
104C63D2546B8021DD105E9FBA5A8D Blob : {3, 0, 0, 0...}
78169F6B32
<SNIP>

Der persönliche Speicher ist ein weiterer Standardspeicher, und die Zertifikate dieses Speichers werden im Dateisystem und nicht in der Registrierung gespeichert. Der folgende Befehl gibt ein Verzeichnis zurück, das Dateien enthält, die Zertifikaten entsprechen, die im persönlichen Speicher des aktuellen Benutzers installiert sind.

Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificate\My\Certificates\

Jede im folgenden Befehl zurückgegebene Datei verweist auf das Objekt für einen privaten Schlüssel, der vom Key Storage Provider (KSP) erstellt wurde. Der Dateiname entspricht dem Subject Key Identifier des Zertifikats.

Daher wird jedem von uns installierten privaten Schlüssel eine entsprechende Datei hinzugefügt.

Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificate\My\Keys\

Jede Datei im Verzeichnis, die durch den folgenden Befehl erstellt wird, ist ein eindeutiger Container für den verschlüsselten privaten Schlüssel des KSP. Der Dateiname und das Zertifikat haben keine direkte Verbindung, aber die Datei ist das Ziel des Zeigers im vorherigen Befehl.

Get-ChildItem -Path $env:APPDATA\Microsoft\Crypto\Keys

Logischer Speicher

Wir verwenden den logischen Speicher für die restlichen Instanzen, da das Arbeiten mit Zertifikaten in ihren physischen Pfaden ungewöhnlich ist. Auf logische Speicher kann PowerShell über das Cert:PSDrive zugreifen, das Zertifikate physischen Speichern zuordnet.

Bei der Arbeit mit Zertifikaten benötigen wir eine Möglichkeit, Anmeldeinformationen zu filtern und auszuwählen, um bestimmte Vorgänge auszuführen. Beispielsweise werden wir Zertifikate basierend auf dem Wert einer bestimmten Erweiterung prüfen und auswählen.

Für die folgenden Beispiele müssen wir zunächst alle installierten Zertifikate im Root-CA-Speicher auflisten.

Get-ChildItem -Path Cert:\CurrentUser\Root\

Die zurückgegebenen Objekte sind Zertifikatsobjekte, die wir in den folgenden Beispielen verwenden können. Die Zertifikatsobjekte haben bereits gemeinsame Erweiterungen als Eigenschaften.

Wir verwenden also Get-Member, um alle Eigenschaften der zurückgegebenen Objekte im folgenden Beispiel aufzulisten.

Beispielcode:

# gci is an alias of Get-ChildItem
gci -Path Cert:\CurrentUser\Root | Get-Member -MemberType Properties

Ausgang:

TypeName: System.Security.Cryptography.X509Certificates.X509Certificate2

Name                     MemberType     Definition
----                     ----------     ----------
PSChildName              NoteProperty   string PSChildName=EBE112F56D5FE0BA23289319C89D7784A10CEB61
PSDrive                  NoteProperty   PSDriveInfo PSDrive=Cert
PSIsContainer            NoteProperty   bool PSIsContainer=False
<SNIP>

Wie wir der Ausgabe entnehmen können, helfen uns verschiedene Erweiterungen beim Auffinden des gesuchten Zertifikats. Erweiterungen enthalten Details zum Zertifikat, z. B. wem es ausgestellt wurde, wofür es verwendet werden kann usw.

Wir müssen nach Zertifikaten mit anderen Erweiterungen suchen, z. B. der Zertifikatsvorlage, die in komplexeren Anwendungsfällen verwendet werden. Das Problem besteht darin, dass die Werte dieser Erweiterungen als Array von Ganzzahlen zurückgegeben werden und diese Ganzzahlen ASN.1-codierte Inhalte darstellen.

Wir rufen die Schlüsselverwendung im folgenden Befehl manuell ab, um diese Beziehung anzuzeigen.

((gci -Path Cert:\CurrentUser\Root\ | select -First 1).Extensions | Where-Object {$_.Oid.FriendlyName -eq "Key Usage"}).format($true)

Die Formatmethode, die die ASN.1-Decodierung durchführt, ist das neue Stück, das wir in der obigen Anleitung einführen. Wir geben an, ob das zurückgegebene Objekt einzeilig oder mehrzeilig sein soll, indem wir oben einen booleschen Wert (z. B. $true) übergeben.

Im folgenden Befehl verwenden wir den Fingerabdruckwert des Zertifikats. Der Fingerabdruckwert wird als Windows PowerShell-Variable festgelegt und verwendet, um die entsprechende Zertifizierung in den nächsten Befehlen auszuwählen.

$thumb = "cdd4eeae6000ac7f40c3802c171e30148030c072"
Get-ChildItem -Path Cert:\CurrentUser\Root\ | Where-Object {$_.Thumbprint -eq $thumb}
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn