it-swarm.it

Come posso creare un certificato autofirmato per la firma del codice su Windows?

Come posso creare un certificato autofirmato per la firma del codice utilizzando gli strumenti da Windows SDK?

204
Roger Lipscombe

Risposta aggiornata

Se si utilizzano le seguenti versioni di Windows o successive: Windows Server 2012, Windows Server 2012 R2 o Windows 8.1, quindi MakeCert è ora obsoleto e Microsoft consiglia di utilizzare 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 .

Risposta originale

Mentre è possibile creare un certificato di firma del codice autofirmato (SPC - Software Publisher Certificate ) in una volta sola, preferisco fare quanto segue:

Creazione di un'autorità di certificazione autofirmata (CA)

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 l'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.

Importazione del certificato CA

Poiché non ha senso disporre di un certificato CA se non ci si fida, è necessario importarlo nell'archivio certificati di Windows. Tu can usa il certificato MMC snapin, ma dalla riga di comando:

certutil -user -addstore Root MyCA.cer

Creazione di un certificato di firma del codice (SPC)

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.

Utilizzo del certificato per la firma del codice

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

( Scopri perché i timestamp possono importare )

Se si importa il file PFX nell'archivio certificati (è possibile utilizzare PVKIMPRT o MMC), è possibile firmare il codice come segue:

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

Alcuni possibili timestamp URL per signtool /t siamo:

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

Documentazione Microsoft completa

Download

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 in C:\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).

344
Roger Lipscombe

La risposta di Roger è stata molto utile.

Tuttavia, ho avuto qualche problema ad usarlo e ho continuato a visualizzare la finestra di dialogo di errore "Windows non può verificare l'editore 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
19
Dan Kegel

Come indicato nella risposta, al fine di utilizzare un modo non deprecato per firmare il proprio script, si dovrebbe usare New-SelfSignedCertificate .

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

  2. Esporta il certificato senza la chiave privata:
    Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt Lo [0] funzionerà per casi in cui hai più di un certificato ... Ovviamente fai corrispondere l'indice al certificato che vuoi usare ... o usa un modo filtrare (per thumprint o emittente).

  3. Importalo come Trusted Publisher
    Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher

  4. Importalo come autorità di certificazione principale.
    Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root

  5. Firma la sceneggiatura.
    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.
Puoi ottenere informazioni più dettagliate e alcuni suggerimenti per la risoluzione dei problemi in questo articolo .

14
chaami

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.

12
Yishai

È 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\My

2) imposta la password :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText

3) 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"

12
JerryGoyal