Tags: PowerShell, Zertifikate
Während man früher Tools wie makecert.exe benötigte, um selbstsignierte Zertifikate auszustellen, kann PowerShell diese Aufgabe seit Windows 8 und Server 2012 mit New-SelfSignedCertificate übernehmen. Sie lassen sich etwa für die Client- und Server-Authentifizierung oder die Code-Signierung verwenden.
Selbstsignierte Zertifikate kommen typischerweise in Lab- oder sonstigen kleinen Umgebungen zum Einsatz, wenn man dort keine Windows-Domäne oder eine andere Zertifizierungsstelle einrichten möchte. Aussteller und Benutzer sind dann meist die gleiche Person oder gehören zu einer überschaubaren Gruppe.
Zertifikat mit Default-Werten erstellen
Um ein Zertifikat für SSL auszustellen, kommt das Cmdlet New-SelfSignedCertificate mit wenigen Parametern aus. Ein einfacher Aufruf in einer Sitzung mit administrativen Rechten könnte so aussehen:
New-SelfSignedCertificate -DnsName lab.contoso.de `
-CertStoreLocation Cert:\LocalMachine\My
Dieser Aufruf legt ein neues Zertifikat unter "Eigene Zertifikate" im Store für den lokalen Rechner ab, wobei das Subject auf "lab.contoso.de" lautet. Wie man anschließend mit dem Kommando
dir Cert:\LocalMachine\my\<Thumbprint-des-Zertifikats> | fl -Property *
feststellen kann, verfügt das neue Zertifikat standardmäßig unter anderem über folgende Eigenschaften:
- EnhancedKeyUsageList: {Clientauthentifizierung (1.3.6.1.5.5.7.3.2), Serverauthentifizierung (1.3.6.1.5.5.7.3.1)}
- NotAfter: 22.03.2020 18:52:22
- HasPrivateKey: True
- Issuer: CN=lab.contoso.de
- Subject: CN=lab.contoso.de
Ohne die Spezifizierung eines Typs eignet sich das Zertifikat für die Client- und Serverauthentifizierung. Darüber hinaus ist es 1 Jahr gültig und hat einen privaten Schlüssel. Wie sich mit certutil zeigen lässt, ist dieser exportierbar.
Das Cmdlet stellt bei der Verwendung des Parameters DnsName ein SAN-Zertifikat aus, wobei man die Subject Alternative Names als Komma-separierte Liste angibt. Der erste davon dient dann zusätzlich als Subject und auch als Herausgeber, wenn man über den Parameter Signer kein Zertifikat zum Signieren des neuen Zertifikats spezifiziert.
Erlaubt ist zudem die Angabe von Wildcards nach dem Muster von
New-SelfSignedCertificate -DnsName lab.contoso.de, *.contoso.de `
-cert Cert:\LocalMachine\My
für das Erstellen von Wildcard-Zertifikaten.
Erweiterte Optionen ab Windows 10 und Server 2016
Die meisten Vorgaben für neue Zertifikate kann man durch eigene Parameter von New-SelfSignedCertificate überschreiben, allerdings erst in Windows 10 und Server 2016. Vorher kennt das Cmdlet nur die Parameter DnsName, CloneCert und CertStoreLocation.
So verlängert man die Gültigkeit über ein Jahr hinaus durch die Angabe eines Zeitpunktes:
New-SelfSignedCertificate -DnsName lab.contoso.de `
-CertStoreLocation Cert:\LocalMachine\My -NotAfter (Get-Date).AddYears(2)
Dieses Beispiel legt die Gültigkeit auf 2 Jahre fest.
Darüber hinaus lassen sich auch andere Anwendungen für das Zertifikat definieren als die Client- und Serverauthentifizierung. Der Parameter Type sieht neben dem Vorgabewert SSLServerAuthentication noch
- CodeSigningCert
- DocumentEncryptionCert
- DocumentEncryptionCertLegacyCsp
vor. Hinzu kommt noch Custom, das alle Zwecke für ein Zertifikat aktiviert. Sie lassen sich nachträglich über das MMC-Zertifkat-Snapin wieder einzeln abwählen.
Wenn man nicht möchte, dass der Private Key exportierbar ist, kann man das mit dem Parameter
-KeyExportPolicy NonExportable
erreichen.
Zertifikat exportieren
Möchte man das Zertifikat in eine PFX-Datei exportieren, um es etwa auf einem Web-Server für die IIS zu nutzen, dann dient Export-PfxCertificate diesem Zweck. Es erfordert jedoch, dass man die Zieldatei absichert, entweder über ein Passwort oder mittels Zugriffsrechten, die man über den Parameter ProtectTo festlegt.
Nutzt man ein Kennwort, dann liest man dieses zuerst in einen Secure String ein:
$CertPW = ConvertTo-SecureString -String "geheim" -Force -AsPlainText
Anschließend übergibt man es im Aufruf von Export-PfxCertificate an den Parameter Password:
Export-PfxCertificate -Cert cert:\LocalMachine\My\<Thumbprint> myCert.pfx -Password $CertPW
Das Zertifikat spezifiziert man über den Pfad im Store und seinen Fingerabdruck.
Setzt man ein selbstsigniertes Zertifikat auf einem Server ein, dann gilt dieses den Clients als nicht vertrauenswürdig. Um die entsprechende Warnung zu unterbinden, kann man es dort in die vertrauenswürdigen Stammzertifizierungsstellen importieren, entweder manuell oder über GPO.
Zu diesem Zweck exportiert man das Zertifikat ohne Private Key im DER-codierten Format:
Export-Certificate -Cert Cert:\LocalMachine\My\<Thumbprint> -FilePath MyCert.cer
Als Namensendung für eine solche Exportdatei verwendet man unter Windows üblicherweise ".cer".
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