Signer un code numériquement

De Wiki AutoIt Français
Aller à : navigation, rechercher


Bonjour à tous et bienvenue dans ce 'petit' tutoriel ou je vais essayer de vous présenter plusieurs méthodes pour signer numériquement un programme exécutable, un script AutoIt ou autre. Avant de créer ce tutoriel, je n'avais qu'une très vague idée de ce qui est présenté ci-dessous. C'est pourquoi, je n'ai pas développé certains aspect complémentaires et que je suis resté le plus simple possible sur la partie qui nous intéresse. Vous pourrez à loisir consulter les liens en fin de document, qui m'ont servit à la rédaction de ce tutoriel.



Dans ce tutoriel bien que je donne tous les liens et méthodes pour récupérer les programmes décrit ci-dessous, vous les trouverez dans cette archive Zip (à l'exception d'Abylon SELFCERT).

Il est à noter que CapiCom.dll et signtool.exe ont été placés dans le dossier de SignGUI.



Pour plus d'information sur ce qu'est la signature numérique, cliquez sur ce lien Wikipédia.


Le certificat numérique

Pour pouvoir signer numériquement quelque chose, il vous faut ce que l'on appel un certificat. Il existe plusieurs types de certificats dédiés à telle ou telle type de signature. Pour notre cas, nous n'allons aborder ici que la certification numérique d'un programme ou d'un script. Pour être approuvé, un certificat doit être créé par une autorité de certification (CA, Certificate Authority), qui moyennant finance (de quelques dizaines à plusieurs centaines d'euros par an), vous assure l'identité présentée par le certificat (dont la durée de vie est limitée). Le CA peut révoqué celui-ci, c'est pour cela que Authenticode maintient également en local une liste de révocation de certificat (CRL).

Il existe aussi la possibilité de créer son propre certificat, mais celui-ci ne sera jamais reconnu nativement par les applicatifs gérant la sécurité par certificat, à moins d'avoir les moyens de passer par une AC réputée comme Verisign qui permettra l'intégration à la racine du magasin de certificats.

Ceci dit, pour une utilisation interne ou privée et donc non commerciale, un certificat auto-signé est largement suffisant. Il vous suffira de l'installer une seule fois sur la machine ou doit être exécuté le code, pour que chaque code signer avec le même certificat soit reconnu et validé.


Pour consulter la liste des certificats installés dans Windows, cliquez sur 'Démarrer' puis 'Exécuter' puis tapez et validez la commande : certmgr.msc


Acheter son propre certificat :

Pour acheter votre propre certificat, il vous faudra passer par un organisme agréé nommé autorité de certification (AC). Il existe de nombreux organismes proposant ces services dont l'un des plus connu est Verisign. Vous trouverez sur le lien ci-dessous les principales autorités de certification http://msdn.microsoft.com/en-us/library/ms995347.aspx ainsi que les types de certificats proposés.


Créer son propre certificat (gratuit) :

Vous avez la possibilité grace à divers solutions gratuites, de créer votre propre certificat qui sera alors un certificat non commercial et appelé certificat auto-signé (Self-Cert).


Vous trouverez ci-dessous, trois méthodes de création d'un certificat, mais il en existe d'autres.

Abylon SELFCERT :

Si vous ne souhaitez pas vous embêter avec les méthodes décrites ci-après, vous pouvez utiliser un logiciel dédié tel que abylon SELFCERT qui permet la création d'un certificat de type X.509 v3 Auto-Signé. Tout ce que vous avez à faire, c'est de remplir les champs, de choisir vos options de sécurité et de cliquer le bouton 'Create'.


Interface graphique de abylon SELFCERT


Ensuite, une boite de dialogue vous demandera d'entrer un mot de passe qui permettra de gérer l’accès et l'installation du certificat généré (sauvegardez bien celui-ci car il vous sera utile plus tard).


Demande du mot de passe de la clé privée


Après avoir validé le mot de passe, deux fichiers seront générés. Un fichier .pfx qui correspond au certificat et un fichier .pem qui contient divers informations sur la création de votre certificat, ainsi que les clés privées et publiques de votre certificat (attention à ne pas le laisser trainer !!!).


Fichiers créés par abylon SELFCERT


A la fin de la création du certificat, abylon SELFCERT vous propose de l'installer sur votre machine. Vous pouvez lancer cette opération en faisait simplement deux clic sur le fichier .pfx. Au cours de l'opération d'enregistrement du certificat dans Windows, vous devrez choisir dans quel magasin vous voudrez stoker celui-ci. Par défaut le magasin 'Personnel' est choisit.


Microsoft Selfcert.exe et Makecert.exe :

Il est possible de générer un certificat avec l'outil Selfcert.exe de Microsoft (fournit avec la suite bureautique Office), ceci dit, la clé générée n'est pas "private exportable". Vous ne pourrez donc pas exporter la clef privée pour en faire une sauvegarde ou l'utiliser pour signer à partir d'une autre machine.


La société Microsoft fournit dans ses kits de développement un autre outil nécessaire à la création de certificat Auto-Signé (Self-Cert). Ce programme se nomme Makecert.exe et peut être récupéré (par exemple) à partir du Kit de développement logiciel (SDK) [http://fr.wikipedia.org/wiki/Microsoft Microsoft .NET Framework 2.0 version x86] ou de la version x64.

Une fois le fichier setup.exe téléchargé, installez le et récupérez le programme dans le dossier C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\bin ou ouvrez le fichier avec SevenZip puis faites deux clics sur le fichier netfxsd1.cab et récupérez le fichier FL_makecert_exe_____X86.3643236F_FC70_11D3_A536_0090278A1BB8 qu'il vous suffira de renommer makecert.exe.


Note : L’exécutable Makecert.exe est identique dans le SDK X86 et dans le SDK X64, donc vous pouvez le récupérer indifféremment de l'un ou l'autre des SDK.


Extraction de MakeCert.exe Part1


Extraction de MakeCert.exe Part2


Profitez en pour récupérer et renommer les programmes suivants qui servirons ultérieurement dans ce tutoriel :

  • FL_signtool_exe_102951_____X86.3643236F_FC70_11D3_A536_0090278A1BB8 (signtool.exe)
  • FL_cert2spc_exe_____X86.3643236F_FC70_11D3_A536_0090278A1BB8 (cert2spc.exe)
  • FL_certmgr_exe_____X86.3643236F_FC70_11D3_A536_0090278A1BB8 (certmgr.exe)
  • FL_CapiCom_dll_141190_____X86.3643236F_FC70_11D3_A536_0090278A1BB8 (CapiCom.dll)


Et enfin, si vous souhaitez exporter la clé privée de votre certificat pour pouvoir signer à partir d'un autre ordinateur, vous devrez télécharger le programme pvkimprt.exe disponible aussi dans le pack Office.

Utilisez la même méthode que ci-dessus pour extraire de l'archive pvkimprt.exe le programme d'installation pvkimprt.exe puis ouvrez ce dernier toujours avec SevenZip et récupérez le programme exécutable pvkimprt.exe. Si cette méthode vous parait trop complexe, installez simplement pvkimprt.exe et récupérez l'exécutable dans le dossier d'installation.


Ce qui nous donne cette liste d'outils :


Extraction de MakeCert.exe Part2


Voyons maintenant, comment générer notre certificat par le biais de deux méthodes :


  • Méthode 1 : Utiliser makecert.exe avec l'option "-pe" pour créer et stocker le certificat avec une clé privée exportable :


makecert -r -pe -n "CN=Your Name" -b 01/01/2000 -e 01/01/2099 -eku 1.3.6.1.5.5.7.3.3 -ss My


Pour les détails sur les options utilisées, consultez ce lien. En ce qui concerne le paramètre -ss, il est à noté que My = Personnel, Root = Racine.


Ensuite, vous pourrez exporter le certificat du stockage de certificat Windows avec la clé privée, en utilisant le programme certmgr.exe (récupéré précédemment) ou tout simplement en lançant à partir du menu 'Démarrer' puis 'Exécuter' la commande certmgr.msc (voir le détail de l’assistant d'exportation de certificat ci-dessous).


  • Méthode 2 : Les commandes suivantes peuvent être utilisées pour créer un fichier PFX (PKCS #12) contenant le certificat auto-signé ainsi que la clé privée associée :


makecert -r -n "CN=Your Name" -b 01/01/2000 -e 01/01/2099 -eku 1.3.6.1.5.5.7.3.3 -sv selfcert.pvk selfcert.cer


Cette commande fera apparaître deux fenêtres consécutives qui vous demanderons de saisir le mot de passe pour la clé privée.


Demande du mot de passe de la clé privée #1


Demande du mot de passe de la clé privée #2


Saisissez ensuite les commandes suivantes :


cert2spc selfcert.cer selfcert.spc
pvkimprt -pfx selfcert.spc selfcert.pvk


La dernière commande (pvkimprt -pfx) crée le fichier selfcert.pfx. Ce fichier PFX peut alors être importé dans l'un des magasins de certificats de Windows et/ou être utilisé pour signer un code. Cette commande fait apparaître une nouvelle demande de mot de passe :


Demande du mot de passe de la clé privée #3


Saisissez le mot de passe de votre clé privée afin de faire apparaître l’assistant d'exportation de certificat.


Assistant d'exportation de la clé privée #1


Cliquez sur suivant pour faire apparaître l'écran d'exportation de la clé privée et sélectionnez "oui, exporter la clé privée".


Assistant d'exportation de la clé privée #1


Dans l'écran suivant, choisissez "Échange d'informations personnelles – PKCS #12 (.pfx)" et sélectionnez les deux premières options :


Assistant d'exportation de la clé privée #1


Nouvelle demande du mot de passe de la clé privée :


Assistant d'exportation de la clé privée #1


Ensuite, entrez le nom que vous souhaitez donner à votre fichier certificat :


Assistant d'exportation de la clé privée #1


Et pour finir, validez la fenêtre récapitulative :


Assistant d'exportation de la clé privée #1


Le processus d'export sera confirmé par la boite de dialogue suivante :


Assistant d'exportation de la clé privée #1


Ouf !!!! Nous avons enfin notre certificat avec la clé privée qui va nous permettre de signer nos codes et/ou documents divers ...


Assistant d'exportation de la clé privée #1


Service de certification PKI :

Pour ceux qui sont bien équipé, vous pouvez utiliser votre serveur Windows, après avoir installé le module correspondant, pour générer un certificat interne. Pour plus de détails, consultez ces liens :


Gérer les certificats avec CertUtil :

Une fois en possession de votre certificat, vous pouvez dans le cadre d'une entreprise, vouloir contrôler la présence ou installer automatiquement celui-ci. Pour celà, Microsoft fournit un outil bien pratique qui peut facilement être scripté avec AutoIt. Il s'agit du programme CertUtil.exe que vous pourrez récupérer à partir du pack des outils d'administration de Windows Server 2003.


Extraire CertUtil.exe de l'AdminPack

Encore une fois, il est inutile d'installer le pack complet. Ouvrez adminpak.exe avec SevenZip, puis ouvrez (à l'intérieur) adminpack.msi et enfin récupérez l'exécutable ainsi que sa dll.


Extraction CertUtil.exe #1


Extraction CertUtil.exe #2


Utiliser CertUtil

CertUtil permet de nombreuses tâches divers et variés, dont la gestion des certificats. Voici une liste complète des tâches disponibles.


  • Installer un certificat :

L'une des tâches les plus intéressante à réaliser avec CertUtil, sera d'installer automatiquement un certificat. Voici la ligne de commande :

certutil -user -p motdepasse -importpfx lecteur:\path\certificat.pfx


Le paramètre -user permet d'ajouter le certificat dans le magasin de l'utilisateur. Si ce paramètre n'est pas précisé, le certificat sera ajouté au magasin de l'ordinateur.


Attention, sur un Windows VISTA - SEVEN - Win_2008 - Win_2008R2, l'ajout nécessite les droits Administrateurs. Une demande d'élévation de privilèges sera demandée si l'UAC est activé.



  • Supprimer un certificat :


certutil -user -delstore my 020549b3f5a3de72fbb15a32d47e4ab5


Où 020549b3f5a3de72fbb15a32d47e4ab5 est le numéro de série du certificat qui sera identique quel que soit le magasin dans lequel il sera installé.


  • Lister les certificats installés :


certutil -user -store my


Voici la fenêtre résultante :


Liste des certificats de l'utilisateur


Encore une fois, le résultat de cette fenêtre peut être exploité par AuToIt et donc une automatisation des actions peut être facilement réalisée à des fins pratique.

La signature numérique :

Pour signer numériquement, vous aurez besoin du programme SignTool.exe (successeur de SignCode.exe) ainsi que de la dll CapiCom.dll (récupérés précédemment).

Nous allons voir maintenant, plusieurs méthodes pour utiliser ces programmes et signer un code :

SignGUI :

SignGUI est une simple interface graphique qui vous permettra de signer facilement et rapidement votre exécutable AutoIt. Vous pouvez le télécharger sur ce lien http://www.briggsoft.com/signgui.htm


L'interface de SignGUI


La saisie se passe de commentaire. ^^ Vous devrez simplement prendre soins de placer SignTool.exe et CapiCom.dll (récupérés précédemment) dans le dossier du programme afin que celui-ci fonctionne correctement.


SignTool :

Signer un exécutable

Vous pouvez utiliser SignTool.exe en ligne de commande (ou faire votre propre script pour 'piloter' celui-ci). Par défaut, SignTool utilise le mode "Code Signing" (1.3.6.1.5.5.7.3.3) , il est donc inutile de le préciser. N'oubliez pas la dll CapiCom.dll (récupérés précédemment).


  • Exemple 1 :
Signtool.exe sign /f  selfcert.pfx /p password Programme.exe

Dans l'exemple ci-dessus, nous utilisons le fichier certificat selfcert.pfx (qui se trouve dans le même répertoire que SignTool.exe) ainsi que le mot de passe associé (password), pour signer l'exécutable nommé 'Programme.exe' qui se trouve aussi dans le répertoire de SignTool.exe.


  • Exemple 2 :
Signtool.exe sign /i MyCert Programme.exe

Dans l'exemple ci-dessus, nous utilisons le certificat nommé 'MyCert' qui doit être dans l'un des magasins de certificat de Windows.


  • Exemple 3 :
Signtool.exe sign /i MyCert /t http://timestamp.verisign.com/scripts/timestamp.dll Programme.exe

Dans l'exemple ci-dessus, nous utilisons le certificat nommé 'MyCert' qui doit être dans l'un des magasins de certificat de Windows et nous horodatons la signature avec le site de Vérisign.


  • Exemple 4 :
Signtool.exe signwizard

Dans cet exemple, nous lançons tout simplement l'assistant de signature. Des écrans successifs vous aiderons dans les étapes de signature de votre fichier.


L'objet Scripting.Signer

Il est techniquement possible de signer un code VBS. C'est à dire rajouter un bloc de texte à la fin de celui-ci, qui correspond à la signature du code avec votre certificat. Nous allons donc 'tricher' et faire croire à Windows que notre code Au3 est un code VBS pour qu'il génère la signature. Pour que le script ci-dessous fonctionne, vous devrez impérativement avoir enregistré la dll Capicom.dll (Regsvr32 Capicom.dll) et votre certificat devra être dans l'un des magasins de certificats de Windows.


; Digital Signatures and Timestamp
; This script is based on this links :
; http://www.autoitscript.com/forum/topic/66202-digital-code-signing-your-scrip
; http://www.autoitscript.com/forum/topic/129720-digital-signatures-and-timestamp-with-ssl-certificates

; The following are requested :
; The CapiCom.dll must be regserved in Windows system dir.
; The certificate must be installed in Windows certificate store.
; A web access (for TimeStamp).

OnAutoItExitRegister("ExitFunc")

Global $SrcFile = FileSaveDialog('Select File', @ScriptDir, "Au3 File (*.Au3)")
If $SrcFile = "" Then Exit (0)

Global $DateAndTime = @YEAR & @MON & @MDAY & "-" & @HOUR & @MIN & @SEC
Global $DstFile = StringTrimRight($SrcFile, 4) & "_" & $DateAndTime & "_Signed.au3"
Global $TmpFile = $SrcFile & $DateAndTime & ".vbs"

Global $SignName = InputBox("Certificate Name", "Type the name of your certificate")
If $SignName = "" Then Exit (0)

If Not FileCopy($SrcFile, $TmpFile) Then
	Exit (0)
EndIf

; Initialize error handler
$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")

; --------------------------------- Sign it ----------------------------------
$oSigner = ObjCreate("Scripting.Signer")
$oSigner.SignFile($TmpFile, $SignName)
If @error then Exit
$oSigner = ""
; --------------------------------- Sign it ----------------------------------

; --------------------------------- TimeStampIt ------------------------------
If Ping("www.google.com", 250) Then
	$oSignerCode = ObjCreate("CAPICOM.SignedCode.1")
	$oSignerCode.FileName = $TmpFile
	$oSignerCode.Timestamp("http://timestamp.verisign.com/scripts/timestamp.dll")
	If @error then Exit
	$oSignerCode = ""
EndIf
; --------------------------------- TimeStampIt ------------------------------


If Not @error And FileMove($TmpFile, $DstFile) = 1 Then
	MsgBox(64 + 262144, "SignCode", "The file '" & $DstFile & "' have been created." & @TAB)
	Exit
EndIf


; -------------------------------- Error handler -----------------------------
Func MyErrFunc()
	Local $HexNumber = Hex($oMyError.number, 8)
	MsgBox(48, @ScriptName, "An error has been encountered" & @CRLF & @CRLF & _
			"  description: " & @TAB & $oMyError.description & @CRLF & _
			"             : " & @TAB & $oMyError.windescription & @CRLF & _
			" error number: " & @TAB & $HexNumber & @CRLF & _
			"last dllerror: " & @TAB & $oMyError.lastdllerror & @CRLF & _
			"  line number: " & @TAB & $oMyError.scriptline & @CRLF & _
			"       source: " & @TAB & $oMyError.source & @CRLF & _
			"    help file: " & @TAB & $oMyError.helpfile & @CRLF & _
			"  helpcontext: " & @TAB & $oMyError.helpcontext _
			)
	SetError(1) ; to check for after this function returns
EndFunc   ;==>MyErrFunc
; -------------------------------- Error handler -----------------------------

; -------------------------------- Exit Function -----------------------------
Func ExitFunc()
	If FileExists($TmpFile) Then
		FileDelete($TmpFile)
	EndIf
	Exit
EndFunc
; -------------------------------- Exit Function -----------------------------
Exit

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;     Signature block follows      ;;;;;;;;
;;;;;;;; Must be removed before compiling ;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


Vérifier si un code est signé

Voici quelques méthodes pour vérifier si un exécutable est bien signé. Ceci ne garanti pas la validité du certificat, mais c'est déjà un bon début. Il existe le code WinTrust.au3 sur le forum Allemand qui vérifie l'authenticité d'un code, mais il ne fonctionne pas sur certains fichiers (dont ceux générés avec les méthodes précédentes).


Sigcheck

Vous pouvez télécharger le programme sigcheck.exe et l'utiliser simplement comme ceci :


Sigcheck.exe -q Programme.exe


Si l'exécutable est signé, alors la valeur 'Verified' sera 'Signed' ou 'Untrusted Root' selon le magasin de certificat Windows dans lequel est enregistré le certificat.


Résultat de SigCheck pour le programme AutoIt3.exe


Résultat de SigCheck pour le programme CV.exe (Control Viewer)


L'objet Scripting.Signer

Nous avons vu précédemment comment signer un code en utilisant l'objet Scripting.Signer et la commande SignFile. Il est théoriquement possible de vérifier un code VBS signé par cette méthode, avec la commande VerifyFile. Voici la partie du code AU3 à adapter au code précédent :

; -------------------------------- Check it ----------------------------------
$objSigner = ObjCreate("Scripting.Signer")
$blnIsSigned = $objSigner.VerifyFile($TmpFile, False)

If $blnIsSigned then
    MsgBox(0,"","'" & $SrcFile & "' has been signed.")
Else
    MsgBox(0,"","'" & $SrcFile & "' has not been signed.")
EndIf

$oSigner = ""
; -------------------------------- Check it ----------------------------------


Ceci dit, malgré de nombreuses tentatives, je ne suis pas arrivé à utiliser ce code. A chaque fois, le code est reconnu non signé. Donc si un lecteur assidu trouve la solution, qu'il modifie cette partie du tutoriel, ou qu'il me contacte sur le forum.


Liens externes ayants servit à la rédaction de ce tutoriel