Comment signer facilement un script PowerShell?

15

Je préférerais utiliser la stratégie d'exécution AllSigned avec PowerShell, mais l'auto-signature de mes scripts semble nécessiter plusieurs centaines de mégaoctets de téléchargement et d'installation et le processus de signature semble être un problème.

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

Ville Koskinen
la source

Réponses:

7

Pour effectuer la signature, vous pouvez utiliser l' Set-AuthenticodeSignatureapplet de commande. Cela, bien sûr, nécessite un certificat. Si vous avez une autorité de certification (peu probable) qui sera en mesure de créer un certificat de signature de code. Sinon, il existe différents outils pour créer un certificat auto-signé.

Vous installez le certificat dans votre magasin de certificats (ouvrez le fichier .cerou .pfxdans l'Explorateur Windows pour ce faire), puis passez-le à Set-AuthenticodeSignature(le cert:fournisseur / lecteur 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 du SDK Windows [1] ).

[1] Je suppose que c'est le gros téléchargement dont vous parlez: vous pouvez simplement installer les bits dont vous avez besoin, ou utiliser d'autres outils (OpenSSL inclut la génération de certificats). L'obtention du SDK est, à cet effet, une activité ponctuelle.

Richard
la source
J'accepte cette réponse et je suppose qu'il n'y a pas de raccourci et que la signature doit simplement être effectuée comme mentionné dans les documents.
Ville Koskinen du
1
Comme pour bon nombre de choses «développeur-y», la configuration initiale et l'apprentissage sont difficiles, mais la pratique réelle (surtout si elle est effectuée régulièrement) ne l'est pas.
Richard
7

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`""
}
Bratch
la source
5

Une fois que j'ai eu le certificat, j'ai voulu utiliser importé sur mon compte utilisateur. Ce regkey m'a donné une option, Signer , dans le menu contextuel (j'utilise Windows 7). Si le certificat avec lequel vous souhaitez vous connecter est stocké différemment, modifiez simplement la commande PowerShell à la fin.

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
la source