Come firmare facilmente uno script PowerShell?


15

Preferirei usare la politica di esecuzione di AllSigned con PowerShell, ma l'auto-firma dei miei script sembra richiedere diverse centinaia di megabyte di download e installazione e il processo di firma sembra essere una seccatura.

Esiste un modo più semplice per firmare uno script di PowerShell rispetto a quanto descritto nella documentazione?

Risposte:


7

Per eseguire la firma è possibile utilizzare il Set-AuthenticodeSignaturecmdlet. Questo, ovviamente, richiede un certificato. Se si dispone di un'autorità di certificazione (improbabile) che sarà in grado di creare un certificato di firma del codice. Altrimenti ci sono vari strumenti per creare un certificato autofirmato.

Installi il certificato nel tuo archivio certificati (apri il file .cero .pfxin Esplora risorse per farlo) e poi lo passi a Set-AuthenticodeSignature(il cert:provider / unità dà accesso ai certificati nel tuo archivio).

Uso

help about_signing

o la versione online di tale argomento della guida per i dettagli (inclusa la creazione di un certificato autofirmato utilizzando gli strumenti di Windows SDK [1] ).

[1] Suppongo che questo sia il grande download a cui ti riferisci: puoi semplicemente installare i bit di cui hai bisogno o utilizzare altri strumenti (OpenSSL include la generazione di certificati). Ottenere l'SDK è, a tal fine, un'attività una tantum.


Sto accettando questa risposta e presumo che non ci siano scorciatoie e la firma deve solo essere fatta come menzionato nei documenti.
Ville Koskinen,

1
Come alcune cose "sviluppatore-y" l'impostazione iniziale e l'apprendimento sono difficili, ma la pratica effettiva (specialmente se eseguita regolarmente) non lo è.
Richard

7

Uso questo script di 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`""
}

5

Una volta ottenuto il certificato, volevo utilizzare importato sul mio account utente. Questa regkey mi ha dato un'opzione, Sign , nel menu contestuale (sto usando Windows 7). Se il certificato con cui si desidera firmare è archiviato in modo diverso, è sufficiente modificare il comando PowerShell alla fine.

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]"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.