¿Cómo creo un certificado autofirmado para la firma de código utilizando herramientas del SDK de Windows?
¿Cómo creo un certificado autofirmado para la firma de código utilizando herramientas del SDK de Windows?
Respuestas:
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) .
Si bien puede crear un certificado de firma de código autofirmado (SPC - Software Publisher Certificate ) de una sola vez, prefiero hacer lo siguiente:
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.
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
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.
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 /t
son:
http://timestamp.verisign.com/scripts/timstamp.dll
http://timestamp.globalsign.com/scripts/timstamp.dll
http://timestamp.comodoca.com/authenticode
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).
E=your@email
. Por ejemplo:makecert -pe -n "CN=My SPC,E=email@domain" ........
-eku 1.3.6.1.5.5.7.3.3
por lo que el certificado puede ser utilizado para la firma de código (sé PowerShell no firma guiones si no se encuentra la misma)
Como se indica en la respuesta, para usar una forma no obsoleta de firmar su propio script, uno debe 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
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).
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, 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 .
(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
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
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 \ My2) establezca la contraseña :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText3) 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"
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 .