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


¿Cómo puedo crear un certificado autofirmado para la firma de código con herramientas del SDK de Windows?

Author: Roger Lipscombe, 2008-09-17

5 answers

Respuesta actualizada

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

Si está utilizando una versión anterior como Windows 7, tendrá que seguir con MakeCert u otra solución. Algunas personas sugieren la Infraestructura de Clave Pública Módulo Powershell (PSPKI) .

Respuesta original

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

Creación de una autoridad de certificación (CA) autofirmada

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

(^=permitir que la línea de comandos por lotes se ajuste a la línea)

Esto crea un certificado autofirmado (- r), con una clave privada exportable (- pe). Se llama "Mi CA", y se debe poner en el CA almacenar para el usuario actual. Estamos usando el algoritmo SHA-256. La clave es para firmar (- sky).

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

Importando el certificado de CA

Dado que no tiene sentido tener un certificado de CA si no confía en él, deberá importarlo al almacén de certificados de Windows. puede usar el snapin de certificados MMC, pero desde el comando línea:

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 el anterior, pero estamos proporcionando una clave de emisor y un certificado (los switches-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 interruptor-po, de lo contrario PVK2PFX crea un archivo PFX sin frase de contraseña.

Uso del certificado para la firma 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 snapin MMC), puede firmar el código de la siguiente manera:

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

Algunas posibles URLs de marca de tiempo para signtool /t son:

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

Microsoft completo documentación

Descargas

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

MakeCert está disponible desde el símbolo del sistema de Visual Studio. Visual Studio 2015 lo tiene, y puede ser iniciado desde el menú Inicio en Windows 7 bajo "Desarrollador Símbolo del sistema para VS 2015" o "VS2015 x64 Native Tools Símbolo del sistema" (probablemente todos ellos en la misma carpeta).

 323
Author: Roger Lipscombe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-09 18:33:57

La respuesta de Roger fue muy útil.

Tuve un pequeño problema para usarlo, sin embargo, y siguió recibiendo el rojo "Windows no puede verificar el editor de este software de controlador" diálogo de error. 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 en absoluto (excepto por algunas contraseñas pedir).

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
 16
Author: Dan Kegel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-18 08:39: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 están en Creación de certificados autofirmados con PowerShell.

 11
Author: Yishai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-18 08:40:59

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

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

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

3) Exportación it :
Export-PfxCertificate-Cert " cert:\CurrentUser\My \ My (cer cert.Huella digital)" - Ruta de archivo "d:\selfsigncert.pfx " - Password {CertPassword

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


Paso opcional: También necesitará agregar la contraseña del certificado a las variables de entorno del sistema. para ello, introduzca a continuación en cmd: setx CSC_KEY_PASSWORD "my_password"

 8
Author: JerryGoyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-23 13:20:54

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

  1. Generar la clave:
    New-SelfSignedCertificate -DnsName [email protected] -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My

  2. Exportar 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 utilice una manera de filtrar (por thumprint o emisor).

  3. Importar como Editor de Confianza
    Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher

  4. Impórtelo como una autoridad de certificado raíz.
    Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root

  5. Firma el guión.
    Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

Obviamente, una vez que haya configurado la clave, simplemente puede firmar cualquier otro script con ella.
Puede obtener información más detallada y ayuda para solucionar problemas en este artículo.

 5
Author: chaami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-08 05:55:48