it-swarm-pt.tech

Como faço para criar um certificado autoassinado para assinatura de código no Windows?

Como faço para criar um certificado autoassinado para assinatura de código usando ferramentas do Windows SDK?

201
Roger Lipscombe

Resposta Atualizada

Se você estiver usando as seguintes versões do Windows ou posteriores: Windows Server 2012, Windows Server 2012 R2 ou Windows 8.1, em seguida, o MakeCert está obsoleto e a Microsoft recomenda o uso do PowerShell Cmdlet 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 Powershell de Chave Pública (PSPKI) .

Resposta Original

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

Criando uma autoridade de certificação (CA) 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 em lote contorne a linha)

Isso cria um certificado auto-assinado (-r), com uma chave privada exportável (-pe). Ele é chamado "My CA" e deve ser colocado na CA store para o usuário atual. Estamos usando o algoritmo SHA-256 . A chave é para 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 há sentido em ter um certificado de autoridade de certificação se você não confiar nele, será necessário importá-lo para o armazenamento de certificados do Windows. Você pode usar o snap-in Certificates MMC, mas a partir da 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 (os switches -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ê quiser 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 o 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 (você pode usar o PVKIMPRT ou o MMC snapin), poderá assinar o código da seguinte maneira:

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

Alguns URLs de timestamp possíveis para signtool /t sã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 .NET, você precisará de uma cópia do Windows SDK e do .NET framework. Um link atual está disponível aqui: SDK e .NET (que instala o makecert em 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 possui, e pode ser iniciado a partir do menu Iniciar no Windows 7 em "Prompt de comando do desenvolvedor para o VS 2015" ou "Prompt de comando de ferramentas nativas VS2015 x64" (provavelmente todos eles na mesma pasta).

340
Roger Lipscombe

A resposta de Roger foi muito útil.

Eu tive um pequeno problema em usá-lo, e continuei recebendo a caixa de diálogo de erro 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 alguns prompts 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
17
Dan Kegel

Como afirmado na resposta, a fim de usar uma maneira não obsoleta de 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

  2. Exportar o certificado sem a chave privada:
    Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt O [0] fará este trabalho para casos em que você tem mais de um certificado ... Obviamente, faça o índice igualar o certificado que você quer usar ... ou use uma maneira de filtrar (pelo thumprint ou emitente).

  3. Importá-lo como Trusted Publisher
    Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher

  4. Importe-o como uma autoridade de certificação raiz.
    Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root

  5. Assine o script.
    Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

Obviamente, depois de configurar a chave, você pode simplesmente assinar qualquer outro script com ela.
Você pode obter informações mais detalhadas e algumas soluções de problemas em este artigo .

13
chaami

A partir do PowerShell 4.0 (Windows 8.1/ Server 2012 R2) é possível fazer um certificado no Windows sem 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.

12
Yishai

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

1) Criar certificado :
$ cert = Novo-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) Exportar :
Export-PfxCertificate -Cert "cert:\CurrentUser\Meu\$ ($ cert.Thumbprint)" -FilePath "d:\selfsigncert.pfx" -Password $ CertPassword

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


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

12
JerryGoyal