auto assinatura do script powershell

1

Eu criei um certifiacte autodesignado com o cmdlet Power Shell

New-SelfSignedCertificate -DnsName test.OJ.com -CertStoreLocation cert:\LocalMachine\My

Depois disso, o certificado pode ser visto em certlm em certificados pessoais

Agora quero usar este certificado para assinar um script PS. Eu tentei dois métodos 1. com console PS

$cert = @(Get-ChildItem cert:\CurrentUser\My -CodeSigning)[0] 

Set-AuthenticodeSignature .\scriptTosing.ps1 $cert

após a primeira execução do comando, a variável $ cert está vazia

2. Usando SingTool.exe

signtool.exe  sign /debug /a ".\scriptTosing.ps1" 

Este é o resultado:

The following certificates were considered:


After EKU filter, 0 certs were left.

After expiry filter, 0 certs were left.

After Private Key filter, 0 certs were left.

SignTool Error: No certificates were found that met all the given criteria.

Por favor, informe

    
por OJNSim 13.11.2016 / 18:06

1 resposta

0

Isso foi difícil de descobrir - mas no final uma solução muito fácil

A documentação de Get-ChildItem -CodeSigning diz:

-CodeSigningCert

Gets only those certificates with code-signing authority. This parameter gets certificates that have "Code Signing" in their EnhancedKeyUsageList property value.

Sua variável $cert está vazia, porque ela não recebe um retorno do comando get-childitem , porque seu certificado não sabe que é um certificado CodeSigning, porque a propriedade EnhancedKeyUsage não é igual a "CodeSigning "(também, você armazena o Cert em LocalMachine , mas quer lê-lo de CurrentUser que está errado).

Então, quando você estiver criando seu certificado com New-SelfSignedCertificate , será necessário informar ao certificado que ele precisa ser um Certificado de assinatura do código.

O cmdlet New-SelfSignedCertificate tem o seguinte parâmetro:

-Type (Microsoft.CertificateServices.Commands.CertificateType)

Specifies the type of certificate that this cmdlet creates. The acceptable values for this parameter are:

-- CodeSigningCert -- Custom -- DocumentEncryptionCert -- DocumentEncryptionCertLegacyCsp -- SSLServerAuthentication (default)

Assim, todo o seu script tem que ser assim:

New-SelfSignedCertificate -DnsName test.OJ.com -CertStoreLocation cert:\LocalMachine\My -type CodeSigning
$cert = @(Get-ChildItem cert:\LocalMachine\My -CodeSigning)[0] 
Set-AuthenticodeSignature .\scriptTosing.ps1 $cert
    
por 14.11.2016 / 17:12