Como crio um certificado autoassinado para assinatura de código usando ferramentas do Windows SDK?
Como crio um certificado autoassinado para assinatura de código usando ferramentas do Windows SDK?
Respostas:
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) .
Embora você possa criar um certificado de assinatura de código autoassinado (SPC - Software Publisher Certificate ) de uma só vez, prefiro fazer o seguinte:
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.
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
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.
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 /t
são:
http://timestamp.verisign.com/scripts/timstamp.dll
http://timestamp.globalsign.com/scripts/timstamp.dll
http://timestamp.comodoca.com/authenticode
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).
E=your@email
. Exemplo:makecert -pe -n "CN=My SPC,E=email@domain" ........
-eku 1.3.6.1.5.5.7.3.3
assim o certificado pode ser usado para assinatura de código (eu sei powershell não assinar scripts Se estiver em falta dela)
Como indicado na resposta, para usar uma maneira não reprovada para assinar seu próprio script, deve-se usar New-SelfSignedCertificate .
New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
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).
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
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 .
(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
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
É 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 \ My2) defina a senha para ele :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText3) 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"
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 .