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


Risposte:


363

Risposta aggiornata

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 .

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

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. È possibile utilizzare lo snap-in MMC certificati, 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 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 /tsono:

  • 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 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).


Esiste un modo per popolare il campo dell'indirizzo e-mail del certificato usando questo metodo? Fare clic con il tasto destro del mouse su exe> proprietà> firme digitali e-mail mostra "non disponibile" dopo la firma.
cronoklee,

Se ricevi errori "troppi parametri", allora controlli che non hai modificato accidentalmente uno dei trattini. In caso contrario, digitare nuovamente i trattini, non copiare e incollare.
Fiat

8
@cronoklee Per popolare il campo e-mail del certificato, è sufficiente aggiungere E=your@email. Ad esempio:makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W

1
Non è necessario il flag chiave Uso esteso, -eku 1.3.6.1.5.5.7.3.3quindi il certificato può essere utilizzato per la firma del codice (so che PowerShell non riesce a firmare gli script se manca)
Scott Chamberlain,

1
@AdamPhelps, Windows non "impara" a fidarsi del tuo certificato. Gli utenti devono installare il certificato CA nell'archivio principale. Questa è, generalmente, una cattiva idea (perché i certificati CA radice possono essere usati per scopi nefasti). Si può avere senso in uno scenario aziendale, però.
Roger Lipscombe,

36

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

  1. Genera la chiave:
New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. 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 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).

  1. Importalo come Trusted Publisher
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. Importalo come autorità di certificazione principale.
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. Firma lo script (supponendo che qui si chiama script.ps1, correggi il percorso di conseguenza).
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 .


Grazie per questo Avrei dovuto iniziare prima dalle risposte in basso!
mdiehl13

Grazie. Ciò ha risolto tutti i miei problemi nel tentativo di far funzionare questo processo "apparentemente semplice".
Dave,

1
Ho ricevuto un errore su "2." a causa della (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
lundman il

1
@Lara grazie per il feedback Ho aggiunto alcune informazioni contestuali per renderlo più facile anche quando
provo

1
@Lara grazie per la segnalazione, non avevo prestato molta attenzione durante la modifica, sembra che StackOverflow sia ora più esigente sulla sintassi dei blocchi e ora richieda una nuova riga prima dell'inizio del codice.
Chaami,

21

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

4
Se si desidera utilizzarlo per la firma dei driver, è necessario importare il certificato CA nell'archivio macchine. Il mio esempio lo importa nell'archivio utenti, che va bene per la maggior parte dei software, per scopi di test / interni.
Roger Lipscombe,

20

È 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) impostare la password per esso :
$ 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"


JerryGoyal sai come convertire un certificato autofirmato in un certificato certificato radice CA?
Heelis,

12

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 .


3
Vale la pena ricordare che, anche se si installa l'aggiornamento WMF per ottenere PowerShell 4.0 su Windows 7, non si avrà accesso a questo comando. Sembra essere Win8 o Server 2012 o successivo.
Daniel Yankowsky,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.