Damit ein PowerShell Script signiert werden kann muss man im besitz eines Zertifikates mit dem “Intended Purpose” Code Signing sein. So ein Zertifikat kann man sich selbst ausstellen, oder von einer Enterprise CA anfordern. Natürlich kann man es auch kaufen…
Wie man ein SelfSigned Zertifikat erstellt ist ausführlich in der Hilfe beschrieben, einfach “Get-Help about_signing” ausführen.
Um ein Code Signing Zertifikat von Enterprise Zertifizierungsstelle anzufordern muss man “Enroll” Berechtigungen auf die Zertifikatsvorlage haben, oder man kopiert die Vorlage und erstellt eine eigene, z.B. mit längerer Gültigkeit.
Hat man also ein Zertifikat erhalten findet man es mit folgendem cmdlet:
Get-ChildItem cert:\CurrentUser\My –codesigning
Mit Set-AuthenticodeSignature wird ein Script signiert, dieses cmdlet benötigt zwei Parameter, das zu Signierende Script und das Zertifikat.
Im Folgenden Beispiel signiere ich die Datei C:\scripts\my-test.ps1 mit dem einzigen Zertifikat das in meinem Zertifikatsstore ist.
Set-AuthenticodeSignature C:\scripts\my-test.ps1 $cert</code> Erscheint folgender Fehler, hat man das Script mit PowerShell ISE erstellt. Diese verwendet eine Codierung mit der Set-AuthenticodeSignature nicht zurechtkommt. Man erhält den vielsagenden Fehler: UnknonError. Um das Script trotzdem zu signieren erstellt man ein einfach eine neue Textdatei und speichert das Scripts mit notepad ab. Und schon ist das Script signiert. Wenn man das Script jetzt auf einem Host ausführt auf dem die ExecutionPolicy auf AllSigned gesetzt ist wird man informiert dass der Herausgeber unbekannt ist. Das Zertifikat welches zum Signieren verwendet wurde muss im TrustedPublisher Zertifikatstore sein. Um das Zertifikat zu exportieren kann man die MMC Certficates verwenden, das Code Signing Zertifikat auswählen und auf Export klicken. Den Privat Key kann man nicht exportieren, dieser wird auch nicht benötigt um die Signatur zu bestätigen. Die .cer Datei die man nach dem Export erhält kann man mit Gruppenrichtlinien auf alle Clients/Server verteilen oder manuell in den Store für Vertrauenswürdige Herausgeber importieren. Gruppenrichtlinie: Nach dem nächsten GP Refresh läuft das Script ohne Fehlermeldung. Wird ein Script verändert nachdem es signiert wurde, wird die Ausführung verhindert. Folgende Fehlermeldung erscheint. tom$cert = Get-ChildItem cert:\CurrentUser\My –codesigning</p>