Wie kann ich ein PowerShell-Skript einfach signieren?

15

Ich würde es vorziehen, die AllSigned-Ausführungsrichtlinie mit PowerShell zu verwenden, aber das Selbstsignieren meiner Skripts erfordert anscheinend mehrere Hundert Megabyte an Download und Installation, und der Signiervorgang scheint mühsam zu sein.

Gibt es eine einfachere Methode zum Signieren eines PowerShell-Skripts als in der Dokumentation beschrieben?

Ville Koskinen
quelle

Antworten:

7

Zum Signieren können Sie das Set-AuthenticodeSignatureCmdlet verwenden. Dies setzt natürlich ein Zertifikat voraus. Wenn Sie eine Zertifizierungsstelle haben (unwahrscheinlich), die ein Codesignaturzertifikat erstellen kann. Ansonsten gibt es verschiedene Tools, um ein selbstsigniertes Zertifikat zu erstellen.

Sie installieren das Zertifikat in Ihrem Zertifikatspeicher (öffnen Sie dazu die Datei .ceroder .pfxin Windows Explorer) und übergeben es an Set-AuthenticodeSignature(der cert:Anbieter / das Laufwerk gewährt Zugriff auf Zertifikate in Ihrem Speicher).

Verwenden

help about_signing

In der Online-Version dieses Hilfethemas finden Sie weitere Informationen (einschließlich der Erstellung eines selbstsignierten Zertifikats mit den Windows SDK-Tools [1] ).

[1] Ich gehe davon aus, dass dies der große Download ist, auf den Sie sich beziehen: Sie können einfach die benötigten Bits installieren oder andere Tools verwenden (OpenSSL beinhaltet die Zertifikaterstellung). Das Erhalten des SDK ist zu diesem Zweck eine einmalige Aktivität.

Richard
quelle
Ich akzeptiere diese Antwort und gehe davon aus, dass es keine Verknüpfung gibt und das Signieren nur wie in den Dokumenten erwähnt erfolgen muss.
Ville Koskinen
1
Wie so manche "Entwickler" -Dinge ist das anfängliche Einrichten und Lernen schwierig, aber die tatsächliche Praxis (besonders wenn sie regelmäßig durchgeführt wird) ist es nicht.
Richard
7

Ich benutze dieses PowerShell-Skript:

## sign-script.ps1
## Sign a powershell script with a Thawte certificate and 
## timestamp the signature
##
## usage: ./sign-script.ps1 c:\foo.ps1 

param([string] $file=$(throw “Please specify a script filepath.”)) 

$certFriendlyName = "Thawte Code Signing"
$cert = gci cert:\CurrentUser\My -codesigning | where -Filter 
  {$_.FriendlyName -eq $certFriendlyName}

# https://www.thawte.com/ssl-digital-certificates/technical-  
#   support/code/msauth.html#timestampau
# We thank VeriSign for allowing public use of their timestamping server.
# Add the following to the signcode command line: 
# -t http://timestamp.verisign.com/scripts/timstamp.dll 
$timeStampURL = "http://timestamp.verisign.com/scripts/timstamp.dll"

if($cert) {
    Set-AuthenticodeSignature -filepath $file -cert $cert -IncludeChain All -   
      TimeStampServer $timeStampURL
}
else {
    throw "Did not find certificate with friendly name of `"$certFriendlyName`""
}
Bratch
quelle
5

Sobald ich das Zertifikat hatte, wollte ich es in meinem Benutzerkonto importieren. Diese regkey gab mir eine Option, Zeichen , im Kontextmenü (Ich verwende Windows 7). Wenn das Zertifikat, mit dem Sie signieren möchten, anders gespeichert ist, ändern Sie am Ende einfach den PowerShell- Befehl.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1]

[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell]

[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell\Sign]

[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell\Sign\Command]
@="C:\\\Windows\\\System32\\\WindowsPowerShell\\\v1.0\\\powershell.exe -command Set-AuthenticodeSignature '%1' @(Get-ChildItem cert:\\\CurrentUser\\\My -codesigning)[0]"
Fawr
quelle