¿Cómo creo un certificado autofirmado para firmar código en Windows?
-
01-07-2019 - |
Pregunta
¿Cómo creo un certificado autofirmado para firmar código usando herramientas del SDK de Windows?
Solución
Respuesta actualizada
Si está utilizando las siguientes versiones de Windows o posteriores:Windows Server 2012, Windows Server 2012 R2 o Windows 8.1 luego MakeCert ahora está en desuso, y Microsoft recomienda usar el cmdlet de PowerShell Nuevo certificado autofirmado.
Si está utilizando una versión anterior, como Windows 7, deberá seguir con MakeCert u otra solución.Algunas personas sugerir el Módulo Powershell de infraestructura de clave pública (PSPKI).
Respuesta original
Si bien puede crear un certificado de firma de código autofirmado (SPC - Certificado de editor de software) de una vez, prefiero hacer lo siguiente:
Crear 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 comando por lotes ajuste 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 del usuario actual.Estamos usando el SHA-256 algoritmo.La clave está destinada a firmar (-sky).
La clave privada debe almacenarse en el archivo MyCA.pvk y el certificado en el archivo MyCA.cer.
Importando el certificado CA
Como no tiene sentido tener un certificado de CA si no confía en él, deberá importarlo al almacén de certificados de Windows.Tú poder use el complemento Certificados MMC, pero desde la línea de comando:
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 prácticamente lo mismo que el anterior, pero proporcionamos 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
(Descubra por qué las marcas de tiempo pueden ser importantes)
Si importa el archivo PFX al 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 posibles URL 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
Documentación completa de Microsoft
Descargas
Para aquellos que no son desarrolladores de .NET, necesitarán una copia del SDK de Windows y del marco .NET.Un enlace actual está disponible aquí: SDK y .NET (que instala makecert en 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 para desarrolladores para VS 2015" o "Símbolo del sistema de herramientas nativas VS2015 x64" (probablemente todos en la misma carpeta).
Otros consejos
La respuesta de Roger fue muy útil.
Sin embargo, tuve algunos problemas para usarlo y seguía apareciendo el cuadro de diálogo de error rojo "Windows no puede verificar el editor de este software de 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 de GUI en absoluto (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
Como se indica en la respuesta, para utilizar una forma no obsoleta de firmar su propio script, se debe usar Nuevo certificado autofirmado.
Generar la clave:
New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
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 en los casos en que tenga más de un certificado...Obviamente haga que el índice coincida con el certificado que desea utilizar...o utilizar una forma de filtrar (por huella digital o emisor).Importarlo como editor de confianza
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
Importarlo como autoridad de certificación raíz.
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
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 la resolución de problemas en Este artículo.
A partir de PowerShell 4.0 (Windows 8.1/Servidor 2012 R2) es posible hacer un certificado en Windows sin makecert.exe.
Los comandos que necesitas son Nuevo certificado autofirmado y Exportar-PfxCertificate.
Las instrucciones están en Creación de certificados autofirmados con PowerShell.
Es bastante fácil usar el Nuevo certificado autofirmado comando en Powershell.Abra powershell y ejecute estos 3 comandos.
1) Crear certificado:
$ cert = new -selfsignedCertificate -dnsname www.yourwebsite.com -ype codiseñando -certstorelocation cert: currentUser my my2) establecer la contraseña para ello:
$ CertPassword = convertTo -Securestring -String "my_passowrd" -force -force3) Exportarlo:
Export -PfxCertificate -Cert "Cert: CurrentUser my $ ($ cert.thumbprint)" -filepath "d: selfsigncert.pfx" -password $ certpassword
Tu certificado selfsigncert.pfx estará ubicado @ D:/
Paso opcional: También deberá agregar la contraseña del certificado a las variables de entorno del sistema.hágalo ingresando a continuación en cmd: setx CSC_KEY_PASSWORD "my_password"