Comment créer un certificat auto-signé pour la signature de code sous Windows?

Réponses:

363

Réponse mise à jour

Si vous utilisez les versions Windows suivantes ou ultérieures: Windows Server 2012, Windows Server 2012 R2 ou Windows 8.1, alors MakeCert est désormais déconseillé et Microsoft recommande d'utiliser la PowerShell Cmdlet New-SelfSignedCertificate .

Si vous utilisez une ancienne version telle que Windows 7, vous devrez vous en tenir à MakeCert ou à une autre solution. Certaines personnes suggèrent le module PSPKI (Public Key Infrastructure Powershell) .

Réponse originale

Bien que vous puissiez créer un certificat de signature de code auto-signé (SPC - Software Publisher Certificate ) en une seule fois, je préfère faire ce qui suit:

Création d'une autorité de certification (CA) auto-signée

makecert -r -pe -n "CN=My CA" -ss CA -sr CurrentUser ^
         -a sha256 -cy authority -sky signature -sv MyCA.pvk MyCA.cer

(^ = autoriser la ligne de commande par lots à boucler la ligne)

Cela crée un certificat auto-signé (-r), avec une clé privée exportable (-pe). Il est nommé "Mon CA" et doit être placé dans le magasin CA pour l'utilisateur actuel. Nous utilisons l' algorithme SHA-256 . La clé est destinée à la signature (-sky).

La clé privée doit être stockée dans le fichier MyCA.pvk et le certificat dans le fichier MyCA.cer.

Importation du certificat CA

Parce qu'il est inutile d'avoir un certificat CA si vous n'y faites pas confiance, vous devrez l'importer dans le magasin de certificats Windows. Vous pouvez utiliser le composant logiciel enfichable MMC Certificats, mais à partir de la ligne de commande:

certutil -user -addstore Root MyCA.cer

Création d'un certificat de signature de code (SPC)

makecert -pe -n "CN=My SPC" -a sha256 -cy end ^
         -sky signature ^
         -ic MyCA.cer -iv MyCA.pvk ^
         -sv MySPC.pvk MySPC.cer

C'est à peu près la même chose que ci-dessus, mais nous fournissons une clé d'émetteur et un certificat (les commutateurs -ic et -iv).

Nous voudrons également convertir le certificat et la clé en un fichier PFX:

pvk2pfx -pvk MySPC.pvk -spc MySPC.cer -pfx MySPC.pfx

Si vous souhaitez protéger le fichier PFX, ajoutez le commutateur -po, sinon PVK2PFX crée un fichier PFX sans phrase secrète.

Utilisation du certificat pour signer le code

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

( Voir pourquoi les horodatages peuvent être importants )

Si vous importez le fichier PFX dans le magasin de certificats (vous pouvez utiliser PVKIMPRT ou le composant logiciel enfichable MMC), vous pouvez signer le code comme suit:

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

Voici quelques URL d'horodatage possibles pour signtool /t:

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

Documentation Microsoft complète

Téléchargements

Pour ceux qui ne sont pas des développeurs .NET, vous aurez besoin d'une copie du SDK Windows et du framework .NET. Un lien actuel est disponible ici: SDK & .NET (qui installe makecert dans C:\Program Files\Microsoft SDKs\Windows\v7.1). Votre kilométrage peut varier.

MakeCert est disponible à partir de l'invite de commandes Visual Studio. Visual Studio 2015 en dispose, et il peut être lancé à partir du menu Démarrer de Windows 7 sous «Invite de commandes développeur pour VS 2015» ou «Invite de commandes des outils natifs VS2015 x64» (probablement tous dans le même dossier).

Roger Lipscombe
la source
Existe-t-il un moyen de remplir le champ d'adresse e-mail du certificat à l'aide de cette méthode? Cliquez avec le bouton droit de la souris sur exe> propriétés> les signatures numériques indiquent que l'e-mail est "non disponible" après la signature.
cronoklee
Si vous obtenez des erreurs «trop de paramètres», vous vérifiez que vous n'avez pas supprimé un des tirets accidentellement. A défaut - retapez les tirets - ne copiez pas coller.
fiat
8
@cronoklee Pour remplir le champ e-mail du certificat, ajoutez simplement E=your@email. Par exemple:makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W
1
N'avez-vous pas besoin de l'indicateur de clé d'utilisation étendue -eku 1.3.6.1.5.5.7.3.3pour que le certificat puisse être utilisé pour la signature de code (je sais que powershell ne parvient pas à signer les scripts s'il en manque)
Scott Chamberlain
1
@AdamPhelps, Windows n'apprendra pas à faire confiance à votre certificat. Vos utilisateurs doivent installer le certificat CA dans le magasin racine. C'est, en règle générale, une mauvaise idée (car les certificats d'autorité de certification racine peuvent être utilisés à des fins néfastes). Cela peut cependant avoir un sens dans un scénario d'entreprise.
Roger Lipscombe
36

Comme indiqué dans la réponse, afin d'utiliser une méthode non obsolète pour signer votre propre script, vous devez utiliser New-SelfSignedCertificate .

  1. Générez la clé:
New-SelfSignedCertificate -DnsName [email protected] -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. Exportez le certificat sans la clé privée:
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt

Le [0] fera cela pour les cas où vous avez plus d'un certificat ... Faites évidemment correspondre l'index au certificat que vous souhaitez utiliser ... ou utilisez un moyen de filtrer (par thumprint ou par émetteur).

  1. Importez-le en tant qu'éditeur approuvé
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. Importez-le en tant qu'autorité de certification racine.
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. Signez le script (en supposant qu'il s'appelle script.ps1, corrigez le chemin d'accès en conséquence).
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

De toute évidence, une fois que vous avez configuré la clé, vous pouvez simplement signer tout autre script avec.
Vous pouvez obtenir des informations plus détaillées et une aide au dépannage dans cet article .

chaami
la source
Merci pour celui-ci. J'aurais dû commencer par les réponses du bas en premier!
mdiehl13
Je vous remercie. Cela a résolu tous mes problèmes en essayant de faire fonctionner ce processus «apparemment simple».
Dave
1
J'ai une erreur sur "2". en raison du (get-ChildItem ...)retour de plusieurs certificats, j'ai donc mis "[0]" à la fin et cela a fonctionné. Comme dansExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
lundman
1
@Lara merci pour les commentaires, j'ai ajouté quelques informations contextuelles pour le rendre plus facile même lorsque j'essaye de faible teneur en caféine ;-)
chaami
1
@Lara merci pour la signalisation, je n'avais pas fait très attention lors de l'édition, il semble que StackOverflow soit maintenant plus pointilleux sur la syntaxe des blocs et nécessite maintenant une nouvelle ligne avant le début du code.
chaami
21

La réponse de Roger a été très utile.

J'ai cependant eu un peu de mal à l'utiliser et j'ai continué à afficher la boîte de dialogue d'erreur rouge «Windows ne peut pas vérifier l'éditeur de ce pilote». La clé était d'installer le certificat racine de test avec

certutil -addstore Root Demo_CA.cer

que la réponse de Roger ne couvrait pas tout à fait.

Voici un fichier batch qui a fonctionné pour moi (avec mon fichier .inf, non inclus). Il montre comment tout faire du début à la fin, sans aucun outil graphique (à l'exception de quelques invites de mot de passe).

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
Dan Kegel
la source
4
Si vous souhaitez l'utiliser pour signer des pilotes, vous devez importer le certificat CA dans le magasin de machines. Mon exemple l'importe dans le magasin d'utilisateurs, ce qui est bien pour la plupart des logiciels, à des fins de test / internes.
Roger Lipscombe
20

Il est assez facile d'utiliser la commande New-SelfSignedCertificate dans Powershell. Ouvrez PowerShell et exécutez ces 3 commandes.

1) Créer un certificat :
$ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com -Type CodeSigning -CertStoreLocation Cert: \ CurrentUser \ My

2) définissez le mot de passe :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText

3) Exportez-le :
Export-PfxCertificate -Cert "cert: \ CurrentUser \ My \ $ ($ cert.Thumbprint)" -FilePath "d: \ selfsigncert.pfx" -Password $ CertPassword

Votre certificat selfsigncert.pfx sera localisé @D:/


Étape facultative: vous devrez également ajouter un mot de passe de certificat aux variables d'environnement système. faites-le en entrant ci-dessous en cmd:setx CSC_KEY_PASSWORD "my_password"

JerryGoyal
la source
JerryGoyal, savez-vous comment convertir un certificat auto-signé en un certificat de confiance CA Root?
M. Heelis
12

Depuis PowerShell 4.0 (Windows 8.1 / Server 2012 R2), il est possible de créer un certificat dans Windows sans makecert.exe .

Les commandes dont vous avez besoin sont New-SelfSignedCertificate et Export-PfxCertificate .

Les instructions se trouvent dans Création de certificats auto-signés avec PowerShell .

Yishai
la source
3
Il convient de mentionner que, même si vous installez la mise à jour WMF pour obtenir PowerShell 4.0 sur Windows 7, vous n'aurez pas accès à cette commande. Il semble que ce soit Win8 ou Server 2012 ou version ultérieure.
Daniel Yankowsky