¿Cómo creo un certificado autofirmado para la firma de código en Windows?

Respuestas:

363

Respuesta actualizada

Si está utilizando las siguientes versiones de Windows o posteriores: Windows Server 2012, Windows Server 2012 R2 o Windows 8.1, entonces MakeCert está en desuso , y Microsoft recomienda usar el Cmdlet de PowerShell New-SelfSignedCertificate .

Si está utilizando una versión anterior como Windows 7, deberá seguir con MakeCert u otra solución. Algunas personas sugieren el módulo de infraestructura de clave pública Powershell (PSPKI) .

Respuesta original

Si bien puede crear un certificado de firma de código autofirmado (SPC - Software Publisher Certificate ) de una sola vez, prefiero hacer lo siguiente:

Crear una autoridad de certificación autofirmada (CA)

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

(^ = permitir la línea de comandos por lotes para ajustar la línea)

Esto crea un certificado autofirmado (-r), con una clave privada exportable (-pe). Se llama "Mi CA" y debe colocarse en la tienda de CA para el usuario actual. Estamos usando el algoritmo SHA-256 . La clave está diseñada para firmar (-sky).

La clave privada debe almacenarse en el archivo MyCA.pvk y el certificado en el archivo MyCA.cer.

Importar el certificado de CA

Debido a que no tiene sentido tener un certificado de CA si no confía en él, deberá importarlo al almacén de certificados de Windows. Usted puede utilizar el complemento MMC certificados, pero a partir de la línea de comandos:

certutil -user -addstore Root MyCA.cer

Crear un certificado de firma 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

Es más o menos lo mismo que arriba, pero estamos proporcionando una clave de emisor y un certificado (los modificadores -ic y -iv).

También queremos convertir el certificado y la clave en un archivo PFX:

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

Si desea proteger el archivo PFX, agregue el modificador -po, de lo contrario PVK2PFX crea un archivo PFX sin frase de contraseña.

Usando el certificado para firmar el código

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

( Vea por qué las marcas de tiempo pueden importar )

Si importa el archivo PFX en el almacén de certificados (puede usar PVKIMPRT o el complemento MMC), puede firmar el código de la siguiente manera:

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

Algunas URL de marca de tiempo posibles signtool /tson:

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

Documentación completa de Microsoft

Descargas

Para aquellos que no son desarrolladores de .NET, necesitarán una copia de Windows SDK y .NET framework. Un enlace actual está disponible aquí: SDK y .NET (que instala makecert C:\Program Files\Microsoft SDKs\Windows\v7.1). Su experiencia puede ser diferente.

MakeCert está disponible desde el símbolo del sistema de Visual Studio. Visual Studio 2015 lo tiene, y se puede iniciar desde el menú Inicio en Windows 7 en "Símbolo del sistema del desarrollador para VS 2015" o "Símbolo del sistema de herramientas nativas VS2015 x64" (probablemente todos en la misma carpeta).

Roger Lipscombe
fuente
¿Hay alguna forma de completar el campo de dirección de correo electrónico del certificado utilizando este método? Haga clic derecho en exe> propiedades> firmas digitales muestra el correo electrónico como "no disponible" después de firmar.
cronoklee
Si obtiene errores de "demasiados parámetros", verifica que no haya editado uno de los guiones accidentalmente. De lo contrario, vuelva a escribir los guiones, no copie y pegue.
Fiat
8
@cronoklee Para completar el campo de correo electrónico del certificado, simplemente agregue E=your@email. Por ejemplo:makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W
1
¿Usted no necesita el uso prolongado de la bandera de llave -eku 1.3.6.1.5.5.7.3.3por lo que el certificado puede ser utilizado para la firma de código (sé PowerShell no firma guiones si no se encuentra la misma)
de Scott Chamberlain
1
@AdamPhelps, Windows no "aprenderá" a confiar en su certificado. Sus usuarios deben instalar el certificado de CA en el almacén raíz. Esto es, en general, una mala idea (porque los certificados raíz de CA pueden usarse para propósitos nefastos). Sin embargo, puede tener sentido en un escenario empresarial.
Roger Lipscombe
36

Como se indica en la respuesta, para usar una forma no obsoleta de firmar su propio script, uno debe usar New-SelfSignedCertificate .

  1. Genera la clave:
New-SelfSignedCertificate -DnsName [email protected] -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. Exporte el certificado sin la clave privada:
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt

El [0] hará que esto funcione para los casos en que tenga más de un certificado ... Obviamente, haga que el índice coincida con el certificado que desea usar ... o use una forma de filtrado (por huella o emisor).

  1. Importarlo como editor de confianza
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. Importarlo como una entidad emisora ​​de certificados raíz.
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. Firme el script (suponiendo que aquí se llama script.ps1, arregle la ruta en consecuencia).
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

Obviamente, una vez que haya configurado la clave, simplemente puede firmar cualquier otra secuencia de comandos con ella.
Puede obtener información más detallada y ayuda con la resolución de problemas en este artículo .

chaami
fuente
Gracias por este ¡Debería haber comenzado desde abajo las respuestas primero!
mdiehl13
Gracias. Esto resolvió todos mis problemas al tratar de hacer que este proceso 'aparentemente simple' funcione.
Dave
1
Recibí un error en "2". debido a la (get-ChildItem ...)devolución de más de un certificado, así que puse "[0]" al final y funcionó. Al igual que enExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
Lundman
1
@Lara, gracias por los comentarios. He agregado información contextual para que sea más fácil, incluso cuando se
prueba
1
@Lara gracias por la señalización, no había prestado mucha atención durante la edición, parece que StackOverflow ahora es más exigente con la sintaxis de los bloques y ahora requiere una nueva línea antes del comienzo del código.
chaami
21

La respuesta de Roger fue muy útil.

Sin embargo, tuve un pequeño problema para usarlo y seguí recibiendo el cuadro de diálogo de error rojo "Windows no puede verificar el editor del software de este controlador". La clave era instalar el certificado raíz de prueba con

certutil -addstore Root Demo_CA.cer

que la respuesta de Roger no cubrió del todo.

Aquí hay un archivo por lotes que funcionó para mí (con mi archivo .inf, no incluido). Muestra cómo hacerlo todo de principio a fin, sin herramientas GUI (excepto algunas indicaciones de contraseña).

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
fuente
44
Si desea usar esto para firmar controladores, debe importar el certificado de CA al almacén de máquinas. Mi ejemplo lo importa a la tienda del usuario, lo cual está bien para la mayoría de los programas, para fines de prueba / internos.
Roger Lipscombe
20

Es bastante fácil usar el comando New-SelfSignedCertificate en Powershell. Abra powershell y ejecute estos 3 comandos.

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

2) establezca la contraseña :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText

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

Su certificado selfsigncert.pfx se ubicará en @D:/


Paso opcional: también deberá agregar la contraseña del certificado a las variables de entorno del sistema. hazlo ingresando a continuación en cmd:setx CSC_KEY_PASSWORD "my_password"

JerryGoyal
fuente
JerryGoyal, ¿sabe cómo convertir un certificado autofirmado en un certificado de confianza raíz de CA?
Sr. Heelis el
12

A partir de PowerShell 4.0 (Windows 8.1 / Server 2012 R2) es posible hacer un certificado en Windows sin makecert.exe .

Los comandos que necesita son New-SelfSignedCertificate y Export-PfxCertificate .

Las instrucciones se encuentran en Creación de certificados autofirmados con PowerShell .

Yishai
fuente
3
Vale la pena mencionar que, incluso si instala la actualización WMF para obtener PowerShell 4.0 en Windows 7, no tendrá acceso a este comando. Parece ser Win8 o Server 2012 o posterior.
Daniel Yankowsky