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.

$cert = Get-ChildItem cert:\CurrentUser\My –codesigning</p>

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.

image

Um das Script trotzdem zu signieren erstellt man ein einfach eine neue Textdatei und speichert das Scripts mit notepad ab.

image

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.

image

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:

image

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.

image

 

tom

This post has been migrated from our earlier blog based on BlogEngine.NET.