web-dev-qa-db-fra.com

Comment signer facilement un script PowerShell?

Je préférerais utiliser la politique d'exécution allsignée avec PowerShell, mais Self-Signing, mes scripts semblent nécessiter plusieurs centaines de mégaoctets de téléchargement et d'installation et que le processus de signature semble être un tracas.

Y a-t-il un moyen plus simple de signer un script PowerShell que décrit dans la documentation?

15
Ville Koskinen

Faire la signature, vous pouvez utiliser Set-AuthenticodeSignature cmdlet. Ceci, bien sûr, nécessite un certificat. Si vous avez une autorité de certification (improbable) qui sera en mesure de créer un certificat de signature de code. Sinon, il existe divers outils pour créer un certificat auto-signé.

Vous installez le certificat dans votre boutique de certificats (ouvrez le .cer ou .pfx Fichier dans l'Explorateur Windows pour le faire), puis transmettez-le à Set-AuthenticodeSignature (les cert: Fournisseur/Drive donne accès aux certificats dans votre magasin).

Utilisation

help about_signing

ou la version en ligne de cette rubrique d'aide pour plus de détails (y compris la création d'un certificat auto-signé à l'aide des outils SDK Windows[1]).

[1] Je suppose que c'est le grand téléchargement que vous parlez de: Vous pouvez simplement installer les bits dont vous avez besoin ou utiliser d'autres outils (OpenSSL inclut la génération de certificats). Obtenir le SDK est, à cette fin, une activité unique.

7
Richard

J'utilise ce script PowerShell:

## 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`""
}
7
Bratch