mercredi 4 décembre 2013

Comment signer numériquement un script Powershell avec un certificat

Comment signer numériquement un script Powershell avec un certificat

Tout programmeur Powershell a été confronté à ce problème de sécurité.
Jusqu'à présent, je m'étais résigné à abaisser le niveau de sécurité de Powershell avec la fameuse commande :
  • Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Ce qui ne me satisfaisait pas pleinement, vu qu'il y avait un danger potentiel qu'un script malveillant s'exécute à mon insu sur ma machine. Grâce à une récente découverte, que je vais vous expliquer en détail, j'ai pu augmenter le niveau de sécurité de Powershell en signant tous mes scripts numériquement :
  • Set-ExecutionPolicy -ExecutionPolicy AllSigned
Voici comment procéder :
  • Il y a un pré-requis : il faut posséder une version de Microsoft Office
  • Si ce n'est pas déjà le cas, il faut installer le composant suivant d'Office :
    • Certificat numérique pour les projets VBA
Office 2007
Office 2013

Création d'un certificat à votre nom :


  • Trouver le programme SelfCert qui se trouve dans votre dossier d'installation de Microsoft Office :
Emplacement du fichier selfcert.exe
  • Exécuter ce programme
  • Saisissez le nom de votre certificat, par exemple votre nom puis cliquer sur OK :
Création d'un certificat avec SelfCert.exe



  • Cliquer sur OK :

Succès de SelfCert

Installation du certificat

  • Ouvrir Powershell ISE en tant qu'administrateur.
  • Régler le niveau de sécurité de Powershell à AllSigned pour n'autoriser que les scripts signés :
Powershell ISE : réglage du niveau de sécurité
  • Toujours dans Powershell ISE, exécuter la commande certmgr pour ouvrir le gestionnaire de certificats. Votre certificat se trouve dans le magasin "Personnel".
Certmgr : le certificat est dans le magasin Personnel
  • Copier le certificat dans le dossier "Autorités de certification racines de confiance" : faire glisser le certificat, avec le bouton droit de la souris, sur le magasin "Autorités de certification racines de confiance" et ensuite cliquer sur "Copier ici"
Certmgr : copie du certificat dans "Autorités de certification racines de confiance"
  • Une fenêtre d'avertissement apparaît. Cliquer sur Oui :
Avertissement de sécurité


  • Puis on vérifie que le certificat figure bien dans "Autorités de certification racines de confiance"
Certmgr :  Le certificat a bien été installé dans "Autorités de certification racines de confiance"
  • Copier le certificat de la même manière dans le magasin "Editeurs approuvés"
  • Fermer Certmgr

Création d'un script Powershell signé avec le certificat :

  • Retour dans Powershell ISE : dans la zone d'écriture de script, taper une commande quelconque (dir par exemple) :

Powershell : écriture d'un script de test qu'on va signer avec le certificat


  • Enregistrer le script pour pouvoir l'exécuter.
  • Exécuter le script (F5)
  • Cette erreur survient parce que votre script n'est pas signé numériquement !
  • Votre script doit être enregistré au format UTF-8 sinon il ne pourra pas être signé. Dans la ligne de commande taper ceci :
    • $psISE.CurrentFile.Save([Text.Encoding]::UTF8) 

Enregistrement au format UTF8

  • Taper ensuite cette commande en adaptant le nom du certificat sur une seule ligne :
    • $cert = Get-ChildItem cert:\CurrentUser\My -codeSigningCert | Where {$_.Subject -eq "CN=Nom de votre certificat"}
  • Taper ensuite $cert pour vérifier que $cert n'a pas une valeur nulle ! une valeur nulle signifie que vous vous êtes trompé dans le nom du certificat ou encore que le certificat n'est pas dans le magasin personnel auquel cas il faut mettre votre certificat dans le dossier personnel en tapant la commande certmgr dans powershell
  • Taper enfin cette commande telle quelle sur une seule ligne :
    •  set-AuthenticodeSignature -filepath $psISE.CurrentFile.FullPath $cert


Signature du certificat réussie
  • Recharger votre script car il a été modifié : il contient désormais sa signature numérique.
  • Faites F5 pour exécuter à nouveau le script. 
  • Cette fois le script s'exécute sans erreur car il est signé :
Exécution du script signé
  • Voilà vous avez fait un test de signature de script Powershell.
  • Maintenant, si quelque chose (un virus par exemple), ou un intrus, ou même vous-même modifiez le script, celui-ci ne pourra plus s'exécuter. Powershell dit que le script a été falsifié.

Script déclaré falsifié

Exportation du certificat

Si vous signez un script et que vous voulez le partager ou le distribuer chez vos clients, il faut fournir aussi votre certificat. Il faut l'exporter depuis certmgr :
  • Exécuter certmgr depuis Powershell, comme vu plus haut.
  • Aller à l'emplacement de votre certificat (magasin personnel)
  • Cliquer sur votre certificat avec le bouton droit de la souris et sélectionner "Exporter" dans "toutes les tâches" :
Certmgr : exportation du certificat
  • Suivez les instructions de l'assistant d'exportation. Personnellement, j'ai laissé les options par défaut.
  • Cela crée un fichier "Nom du certificat.cer" à l'emplacement que vous aurez déterminé.
  • Les personnes qui utiliseront vos scripts pourront installer ce certificat pour utiliser en toute confiance vos scripts. Recommandez leur d'exécuter les scripts avec le niveau de sécurité AllSigned comme expliqué au début de cet article.
Merci d'avoir suivi ce tutoriel !

Aucun commentaire:

Enregistrer un commentaire