Come posso creare un certificato autofirmato per la firma del codice utilizzando gli strumenti di Windows SDK?
Come posso creare un certificato autofirmato per la firma del codice utilizzando gli strumenti di Windows SDK?
Risposte:
Se si utilizzano le seguenti versioni di Windows o successive: Windows Server 2012, Windows Server 2012 R2 o Windows 8.1, MakeCert è ora obsoleto e Microsoft consiglia di utilizzare il Cmdlet di PowerShell New-SelfSignedCertificate .
Se stai utilizzando una versione precedente come Windows 7, dovrai utilizzare MakeCert o un'altra soluzione. Alcune persone suggeriscono il modulo Powershell (PSPKI) Public Key Infrastructure .
Mentre è possibile creare un certificato di firma del codice autofirmato (SPC - Software Publisher Certificate ) in una volta sola, preferisco fare quanto segue:
makecert -r -pe -n "CN=My CA" -ss CA -sr CurrentUser ^
-a sha256 -cy authority -sky signature -sv MyCA.pvk MyCA.cer
(^ = consenti alla riga di comando batch di avvolgere la riga)
Questo crea un certificato autofirmato (-r), con una chiave privata esportabile (-pe). Si chiama "My CA" e deve essere inserito nell'archivio CA per l'utente corrente. Stiamo usando il algoritmo SHA-256 . La chiave è pensata per la firma (-sky).
La chiave privata deve essere archiviata nel file MyCA.pvk e il certificato nel file MyCA.cer.
Poiché non ha senso disporre di un certificato CA se non ci si fida, è necessario importarlo nell'archivio certificati di Windows. È possibile utilizzare lo snap-in MMC certificati, ma dalla riga di 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 lo stesso di sopra, ma stiamo fornendo una chiave e un certificato dell'emittente (le opzioni -ic e -iv).
Vorremmo anche convertire il certificato e la chiave in un file PFX:
pvk2pfx -pvk MySPC.pvk -spc MySPC.cer -pfx MySPC.pfx
Se si desidera proteggere il file PFX, aggiungere l'opzione -po, altrimenti PVK2PFX crea un file PFX senza passphrase.
signtool sign /v /f MySPC.pfx ^
/t http://timestamp.url MyExecutable.exe
( Scopri perché i timestamp possono essere importanti )
Se si importa il file PFX nell'archivio certificati (è possibile utilizzare PVKIMPRT o lo snap-in MMC), è possibile firmare il codice come segue:
signtool sign /v /n "Me" /s SPC ^
/t http://timestamp.url MyExecutable.exe
Alcuni possibili URL timestamp per signtool /t
sono:
http://timestamp.verisign.com/scripts/timstamp.dll
http://timestamp.globalsign.com/scripts/timstamp.dll
http://timestamp.comodoca.com/authenticode
Per coloro che non sono sviluppatori .NET, è necessaria una copia di Windows SDK e .NET framework. Un collegamento corrente è disponibile qui: SDK e .NET (che installa makecert inC:\Program Files\Microsoft SDKs\Windows\v7.1
). Il tuo chilometraggio può variare.
MakeCert è disponibile dal prompt dei comandi di Visual Studio. Visual Studio 2015 ce l'ha e può essere avviato dal menu Start in Windows 7 in "Prompt dei comandi per sviluppatori per VS 2015" o "Prompt dei comandi per strumenti nativi VS2015 x64" (probabilmente tutti nella stessa cartella).
E=your@email
. Ad esempio:makecert -pe -n "CN=My SPC,E=email@domain" ........
-eku 1.3.6.1.5.5.7.3.3
quindi il certificato può essere utilizzato per la firma del codice (so che PowerShell non riesce a firmare gli script se manca)
Come indicato nella risposta, al fine di utilizzare un modo non deprecato per firmare il proprio script, è necessario utilizzare 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
Lo [0] funzionerà per i casi in cui hai più di un certificato ... Ovviamente fai corrispondere l'indice al certificato che vuoi usare ... o usa un modo per filtrare (dall'impronta o dall'emittente).
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)
Ovviamente una volta impostata la chiave, puoi semplicemente firmare qualsiasi altro script con essa.
È possibile ottenere informazioni più dettagliate e alcuni suggerimenti per la risoluzione dei problemi in questo articolo .
(get-ChildItem ...)
restituzione di più di un certificato, quindi ho inserito "[0]" alla fine e ha funzionato. Come inExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
La risposta di Roger è stata molto utile.
Tuttavia, ho avuto qualche problema ad usarlo e ho continuato a visualizzare la finestra di dialogo rossa "Impossibile verificare l'autore di questo software driver". La chiave era installare il certificato root di test con
certutil -addstore Root Demo_CA.cer
che la risposta di Roger non copriva del tutto.
Ecco un file batch che ha funzionato per me (con il mio file .inf, non incluso). Mostra come eseguire tutto dall'inizio alla fine, senza strumenti della GUI (tranne alcune richieste di password).
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
È abbastanza facile usare il comando New-SelfSignedCertificate in Powershell. Apri PowerShell ed esegui questi 3 comandi.
1) Crea certificato :
$ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com -Type CodeSigning -CertStoreLocation Cert: \ CurrentUser \ My2) impostare la password per esso :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText3) Esportalo :
Export-PfxCertificate -cert "cert: \ CurrentUser \ My \ $ ($ cert.Thumbprint)" -FilePath "d: \ selfsigncert.pfx" -Password $ CertPassword
Il tuo certificato selfsigncert.pfx sarà posizionato @D:/
Passaggio facoltativo: è inoltre necessario aggiungere la password del certificato alle variabili di ambiente di sistema. farlo inserendo di seguito in cmd:setx CSC_KEY_PASSWORD "my_password"
A partire da PowerShell 4.0 (Windows 8.1 / Server 2012 R2) è possibile creare un certificato in Windows senza makecert.exe .
I comandi necessari sono New-SelfSignedCertificate e Export-PfxCertificate .
Le istruzioni sono in creazione di certificati autofirmati con PowerShell .