Como crio um certificado autoassinado para assinatura de código no Windows?

Respostas:

363

Resposta atualizada

Se você estiver usando as seguintes versões do Windows ou posterior: Windows Server 2012, Windows Server 2012 R2 ou Windows 8.1, o MakeCert agora está obsoleto e a Microsoft recomenda o uso do Cmdlet do PowerShell New-SelfSignedCertificate .

Se você estiver usando uma versão mais antiga, como o Windows 7, precisará usar o MakeCert ou outra solução. Algumas pessoas sugerem o módulo PSPKI (Public Key Infrastructure Powershell) .

Resposta original

Embora você possa criar um certificado de assinatura de código autoassinado (SPC - Software Publisher Certificate ) de uma só vez, prefiro fazer o seguinte:

Criando uma autoridade de certificação autoassinada

makecert -r -pe -n "CN=My CA" -ss CA -sr CurrentUser ^
         -a sha256 -cy authority -sky signature -sv MyCA.pvk MyCA.cer

(^ = permite que a linha de comando do lote agrupe a linha)

Isso cria um certificado autoassinado (-r), com uma chave privada exportável (-pe). É chamado de "Minha CA" e deve ser colocado na loja da CA para o usuário atual. Estamos usando o algoritmo SHA-256 . A chave é destinada à assinatura (-sky).

A chave privada deve ser armazenada no arquivo MyCA.pvk e o certificado no arquivo MyCA.cer.

Importando o certificado da CA

Como não faz sentido ter um certificado de CA se você não confiar nele, será necessário importá-lo para o armazenamento de certificados do Windows. Você pode usar o snap-in do MMC de certificados, mas na linha de comando:

certutil -user -addstore Root MyCA.cer

Criando um certificado de assinatura de código (SPC)

makecert -pe -n "CN=My SPC" -a sha256 -cy end ^
         -sky signature ^
         -ic MyCA.cer -iv MyCA.pvk ^
         -sv MySPC.pvk MySPC.cer

É praticamente o mesmo que acima, mas estamos fornecendo uma chave e um certificado de emissor (as opções -ic e -iv).

Também queremos converter o certificado e a chave em um arquivo PFX:

pvk2pfx -pvk MySPC.pvk -spc MySPC.cer -pfx MySPC.pfx

Se você deseja proteger o arquivo PFX, adicione a opção -po, caso contrário, o PVK2PFX cria um arquivo PFX sem senha.

Usando o certificado para assinar código

signtool sign /v /f MySPC.pfx ^
              /t http://timestamp.url MyExecutable.exe

( Veja por que os timestamps podem ser importantes )

Se você importar o arquivo PFX para o armazenamento de certificados (poderá usar o PVKIMPRT ou o snap-in MMC), poderá assinar o código da seguinte maneira:

signtool sign /v /n "Me" /s SPC ^
              /t http://timestamp.url MyExecutable.exe

Alguns possíveis URLs de carimbo de data e hora signtool /tsão:

  • http://timestamp.verisign.com/scripts/timstamp.dll
  • http://timestamp.globalsign.com/scripts/timstamp.dll
  • http://timestamp.comodoca.com/authenticode

Documentação completa da Microsoft

Transferências

Para aqueles que não são desenvolvedores de .NET, você precisará de uma cópia da estrutura do Windows SDK e .NET. Um link atual está disponível aqui: SDK & .NET (que instala o makecert in C:\Program Files\Microsoft SDKs\Windows\v7.1). Sua milhagem pode variar.

MakeCert está disponível no prompt de comando do Visual Studio. O Visual Studio 2015 o possui e pode ser iniciado no Menu Iniciar do Windows 7 em "Prompt de Comando do Desenvolvedor para o VS 2015" ou "Prompt de Comando das Ferramentas Nativas do VS2015 x64" (provavelmente todos na mesma pasta).

Roger Lipscombe
fonte
Existe alguma maneira de preencher o campo de endereço de email do certificado usando esse método? Clique com o botão direito do mouse em exe> propriedades> assinaturas digitais mostra o email como "não disponível" após a assinatura.
Cronograma #
Se você receber erros de "muitos parâmetros", verifique se não editou acidentalmente um dos hífens. Caso contrário - digite novamente os hífens - não copie e cole.
Fiat
8
@cronoklee Para preencher o campo de email do certificado, basta adicionar E=your@email. Exemplo:makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W
1
Você não precisa a bandeira estendida chave Use -eku 1.3.6.1.5.5.7.3.3assim o certificado pode ser usado para assinatura de código (eu sei powershell não assinar scripts Se estiver em falta dela)
Scott Chamberlain
1
@AdamPhelps, o Windows não "aprende" a confiar no seu certificado. Seus usuários precisam instalar o certificado da CA no armazenamento raiz. Geralmente, essa é uma má ideia (porque os certificados de CA raiz podem ser usados ​​para fins nefastos). No entanto, pode fazer sentido em um cenário corporativo.
22414 Roger
36

Como indicado na resposta, para usar uma maneira não reprovada para assinar seu próprio script, deve-se usar New-SelfSignedCertificate .

  1. Gere a chave:
New-SelfSignedCertificate -DnsName [email protected] -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. Exporte o certificado sem a chave privada:
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt

O [0] fará isso funcionar nos casos em que você tiver mais de um certificado ... Obviamente, faça o índice corresponder ao certificado que você deseja usar ... ou use uma maneira de filtrar (por impressão digital ou por emissor).

  1. Importá-lo como Publicador Confiável
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. Importe-o como uma autoridade de certificação raiz.
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. Assine o script (assumindo que aqui se chama script.ps1, corrija o caminho de acordo).
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

Obviamente, depois de configurar a chave, você pode simplesmente assinar quaisquer outros scripts com ela.
Você pode obter informações mais detalhadas e alguma ajuda para solução de problemas neste artigo .

chaami
fonte
Obrigado por este. Eu deveria ter começado das respostas inferiores primeiro!
precisa saber é o seguinte
Obrigado. Isso resolveu todos os meus problemas ao tentar fazer esse processo "aparentemente simples" funcionar.
Dave
1
Eu recebi um erro no "2" devido ao (get-ChildItem ...)retorno de mais de um certificado, coloquei "[0]" no final e funcionou. Como emExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
lundman 7/09/18
1
@Lara Obrigado pelo feedback eu adicionei algumas informações contextuais para torná-lo mais fácil, mesmo quando tentando em baixa cafeína ;-)
chaami
1
@ Lara, obrigado por sinalizar, eu não prestei muita atenção durante a edição. Parece que o StackOverflow agora é mais exigente quanto à sintaxe dos blocos e agora exige uma nova linha antes do início do código.
chaami
21

A resposta de Roger foi muito útil.

No entanto, tive um pequeno problema ao usá-lo e continuei recebendo a caixa de diálogo vermelha "O Windows não pode verificar o editor deste software de driver". A chave era instalar o certificado raiz de teste com

certutil -addstore Root Demo_CA.cer

que a resposta de Roger não cobriu completamente.

Aqui está um arquivo em lotes que funcionou para mim (com meu arquivo .inf, não incluído). Ele mostra como fazer tudo do início ao fim, sem nenhuma ferramenta GUI (exceto algumas solicitações de senha).

REM Demo of signing a printer driver with a self-signed test certificate.
REM Run as administrator (else devcon won't be able to try installing the driver)
REM Use a single 'x' as the password for all certificates for simplicity.

PATH %PATH%;"c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin";"c:\Program Files\Microsoft SDKs\Windows\v7.0\Bin";c:\WinDDK\7600.16385.1\bin\selfsign;c:\WinDDK\7600.16385.1\Tools\devcon\amd64

makecert -r -pe -n "CN=Demo_CA" -ss CA -sr CurrentUser ^
   -a sha256 -cy authority -sky signature ^
   -sv Demo_CA.pvk Demo_CA.cer

makecert -pe -n "CN=Demo_SPC" -a sha256 -cy end ^
   -sky signature ^
   -ic Demo_CA.cer -iv Demo_CA.pvk ^
   -sv Demo_SPC.pvk Demo_SPC.cer

pvk2pfx -pvk Demo_SPC.pvk -spc Demo_SPC.cer ^
   -pfx Demo_SPC.pfx ^
   -po x

inf2cat /drv:driver /os:XP_X86,Vista_X64,Vista_X86,7_X64,7_X86 /v

signtool sign /d "description" /du "www.yoyodyne.com" ^
   /f Demo_SPC.pfx ^
   /p x ^
   /v driver\demoprinter.cat

certutil -addstore Root Demo_CA.cer

rem Needs administrator. If this command works, the driver is properly signed.
devcon install driver\demoprinter.inf LPTENUM\Yoyodyne_IndustriesDemoPrinter_F84F

rem Now uninstall the test driver and certificate.
devcon remove driver\demoprinter.inf LPTENUM\Yoyodyne_IndustriesDemoPrinter_F84F

certutil -delstore Root Demo_CA
Dan Kegel
fonte
4
Se você quiser usá-lo para assinar drivers, precisará importar o certificado da CA para o armazenamento da máquina. Meu exemplo importa para o repositório de usuários, o que é bom para a maioria dos softwares, para fins de teste / internos.
Roger Lipscombe
20

É bastante fácil usar o comando New-SelfSignedCertificate no Powershell. Abra o PowerShell e execute esses 3 comandos.

1) Crie um certificado :
$ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com -Type CodeSigning -CertStoreLocation Cert: \ CurrentUser \ My

2) defina a senha para ele :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText

3) Exporte-o :
Export-PfxCertificate -Cert "cert: \ CurrentUser \ My \ $ ($ cert.Thumbprint)" -FilePath "d: \ selfsigncert.pfx" -Password $ CertPassword

Seu certificado selfsigncert.pfx será localizado @D:/


Etapa opcional: você também precisará adicionar a senha do certificado às variáveis ​​de ambiente do sistema. faça isso digitando abaixo em cmd:setx CSC_KEY_PASSWORD "my_password"

JerryGoyal
fonte
JerryGoyal você sabe como converter um certificado autoassinado em um certificado confiável de raiz da CA?
Heelis 29/11
12

A partir do PowerShell 4.0 (Windows 8.1 / Server 2012 R2), é possível criar um certificado no Windows sem o makecert.exe .

Os comandos que você precisa são New-SelfSignedCertificate e Export-PfxCertificate .

As instruções estão em Criando certificados autoassinados com o PowerShell .

Yishai
fonte
3
Vale ressaltar que, mesmo se você instalar a atualização do WMF para obter o PowerShell 4.0 no Windows 7, não terá acesso a esse comando. Parece ser o Win8 ou Server 2012 ou posterior.
precisa saber é o seguinte