Como assinar facilmente um script do PowerShell?

13

Eu prefiro usar a política de execução AllSigned com o PowerShell, mas a assinatura automática dos meus scripts parece exigir várias centenas de megabytes de download e instalação, e o processo de assinatura parece ser um aborrecimento.

Existe uma maneira mais simples de assinar um script do PowerShell do que o descrito na documentação?

    
por Ville Koskinen 11.01.2010 / 10:18

3 respostas

7

Para fazer a assinatura, você pode usar o cmdlet Set-AuthenticodeSignature . Isso, obviamente, requer um certificado. Se você tiver uma autoridade de certificação (improvável) que será capaz de criar um certificado de assinatura de código. Caso contrário, existem várias ferramentas para criar um certificado autoassinado.

Você instala o certificado em seu repositório de certificados (abra o arquivo .cer ou .pfx no Windows Explorer para fazer isso) e o passa para Set-AuthenticodeSignature (o cert: provider / drive dá acesso a certificados na sua loja).

Use

help about_signing

para detalhes (incluindo a criação de um certificado autoassinado usando as ferramentas do Windows SDK [1]).

[1] Eu assumo que este é o grande download: você pode simplesmente instalar os bits que você precisa, ou fazer uso de outras ferramentas (o OpenSSL inclui geração de certificados). Obter o SDK é, para esse propósito, uma atividade única

    
por 11.01.2010 / 11:04
7

Eu uso este script do 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'""
}
    
por 11.08.2010 / 23:36
5

Quando recebi o certificado, queria usar importado na minha conta de usuário. Essa regkey me deu uma opção, Sign , no menu de contexto (estou usando o Windows 7). Se o certificado com o qual você deseja assinar for armazenado de forma diferente, basta alterar o comando PowerShell no 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]"
    
por 21.11.2012 / 03:13