¿Cómo firmar fácilmente un script de PowerShell?

15

Prefiero usar la política de ejecución AllSigned con PowerShell, pero la firma automática de mis scripts parece requerir varios cientos de megabytes de descarga e instalación y el proceso de firma parece ser una molestia.

¿Hay una manera más simple de firmar un script de PowerShell que la descrita en la documentación?

Ville Koskinen
fuente

Respuestas:

7

Para hacer la firma, puede usar el Set-AuthenticodeSignaturecmdlet. Esto, por supuesto, requiere un certificado. Si tiene una Autoridad de certificación (poco probable) que podrá crear un certificado de firma de código. De lo contrario, existen varias herramientas para crear un certificado autofirmado.

Instala el certificado en su almacén de certificados (abra el archivo .cero .pfxen el Explorador de Windows para hacer esto) y luego páselo a Set-AuthenticodeSignature(el cert:proveedor / unidad da acceso a los certificados en su tienda).

Utilizar

help about_signing

o la versión en línea de ese tema de ayuda para obtener detalles (incluida la creación de un certificado autofirmado con las herramientas del SDK de Windows [1] ).

[1] Supongo que esta es la gran descarga a la que te estás refiriendo: puedes instalar los bits que necesitas o utilizar otras herramientas (OpenSSL incluye la generación de certificados). Obtener el SDK es, para este propósito, una actividad única.

Ricardo
fuente
Estoy aceptando esta respuesta y suponiendo que no hay un atajo y la firma solo debe hacerse como se menciona en los documentos.
Ville Koskinen
1
Al igual que algunas cosas de "desarrollador y", la configuración inicial y el aprendizaje son difíciles, pero la práctica real (especialmente si se hace regularmente) no lo es.
Richard
7

Yo uso este script de 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
fuente
5

Una vez que tuve el certificado, quise usar importado en mi cuenta de usuario. Este regkey me dio una opción, Sign , en el menú contextual (estoy usando Windows 7). Si el certificado con el que desea firmar se almacena de manera diferente, simplemente cambie el comando de PowerShell al final.

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
fuente