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 di Windows SDK?

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 PowerShell New-SelfSignedCertificate .

Se stai utilizzando una versione precedente come Windows 7, dovrai utilizzare MakeCert o un’altra soluzione. Alcune persone suggeriscono il modulo PSPKI (Public Key Infrastructure Powershell) .

Risposta originale

Mentre è ansible creare un certificato autofirmato con firma del codice (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 riga di comando batch per tracciare la linea)

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 nel certificato nel file MyCA.cer.

Importazione del certificato CA.

Perché non ha senso avere un certificato CA se non ci si fida di esso, è necessario importarlo nell’archivio certificati di Windows. È ansible 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 la stessa di sopra, ma stiamo fornendo una chiave e un certificato di emittente (gli switch -ic e -iv).

Vogliamo 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 il codice di firma

 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 (è ansible utilizzare PVKIMPRT o lo snap-in MMC), è ansible firmare il codice come segue:

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

Alcuni possibili URL di timestamp per signtool /t sono:

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

Documentazione completa di Microsoft

  • SignTool
  • makecert
  • pvk2pfx

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 lanciato dal menu Start di Windows 7 in “Prompt dei comandi dello sviluppatore per VS 2015” o “Prompt dei comandi di Native Tools VS2015 x64” (probabilmente tutti nella stessa cartella).

La risposta di Roger è stata molto utile.

Ho avuto un piccolo problema nell’utilizzarlo e ho continuato a ricevere la finestra di dialogo rossa “Windows non può verificare l’editore di questo driver”. La chiave era installare il certificato radice di test con

 certutil -addstore Root Demo_CA.cer 

che la risposta di Roger non copriva affatto.

Ecco un file batch che ha funzionato per me (con il mio file .inf, non incluso). Mostra come fare tutto dall’inizio alla fine, senza strumenti GUI (eccetto alcuni prompt 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 ^ /px ^ /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 

A partire da PowerShell 4.0 (Windows 8.1 / Server 2012 R2) è ansible 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 .

È abbastanza facile utilizzare il comando New-SelfSignedCertificate in Powershell. Apri PowerShell ed esegui questi 3 comandi.

1) Crea certificato :
$ cert = New-SelfSignedCertificate -DnsName http://www.yourwebsite.com -Type CodeSigning -CertStoreLocation Cert: \ CurrentUser \ My

2) imposta la password per questo :
$ CertPassword = ConvertTo-SecureString -String “my_passowrd” -Force -AsPlainText

3) Esportalo :
Export-PfxCertificate -Cert “cert: \ CurrentUser \ My \ $ ($ cert.Thumbprint)” -FilePath “d: \ testcert.pfx” -Password $ CertPassword

Il tuo certificato testcert.pfx si troverà @ D:/

Come indicato nella risposta, per usare un modo non deprecato di 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) -FilePath code_signing.crt

  3. Importa come editore attendibile
    Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher

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

  5. Firma lo script.
    Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

Ovviamente una volta impostata la chiave, puoi semplicemente firmare qualsiasi altro script con esso.
In questo articolo puoi ottenere informazioni più dettagliate e alcuni aiuti per la risoluzione dei problemi.