Como assinar um script do PowerShell facilmente?

15

Prefiro usar a política de execução AllSigned com o PowerShell, mas a autoassinatura de 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?

Ville Koskinen
fonte

Respostas:

7

Para assinar, você pode usar o Set-AuthenticodeSignaturecmdlet. Isso, é claro, requer um certificado. Se você tiver uma Autoridade de Certificação (improvável) 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 no seu repositório de certificados (abra o arquivo .cerou .pfxno Windows Explorer para fazer isso) e depois o passa para Set-AuthenticodeSignature(o cert:provedor / unidade dá acesso aos certificados na sua loja).

Usar

help about_signing

ou a versão online desse tópico de ajuda para obter detalhes (incluindo a criação de um certificado autoassinado usando as ferramentas do Windows SDK [1] ).

[1] Presumo que este seja o grande download a que você está se referindo: você pode simplesmente instalar os bits necessários ou fazer uso de outras ferramentas (o OpenSSL inclui geração de certificado). Obter o SDK é, para essa finalidade, uma atividade pontual.

Richard
fonte
Estou aceitando esta resposta e assumindo que não há atalho e assinatura, apenas precisa ser feito conforme mencionado nos documentos.
Ville Koskinen
1
Como algumas coisas do tipo "desenvolvedor-y", a configuração inicial e o aprendizado são difíceis, mas a prática real (especialmente se feita regularmente) não é.
Richard
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`""
}
Bratch
fonte
5

Depois de obter o certificado, quis usar importado na minha conta de usuário. Essa regkey me deu uma opção, Entrar , no menu de contexto (estou usando o Windows 7). Se o certificado com o qual você deseja assinar estiver armazenado de maneira diferente, basta alterar o comando do 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]"
Fawr
fonte