Avez-vous besoin de vous assurer que personne ne modifie vos scripts et les présente comme étant originaux ? Si c’est le cas, alors vous devez apprendre à signer des scripts PowerShell. La signature ajoute l’identité de l’éditeur au script afin que les utilisateurs puissent décider s’ils font confiance à la source du script.
Dans cet article, apprenez comment vous assurer que seuls les scripts de confiance sont exécutés dans votre environnement en apprenant à signer des scripts PowerShell.
Prérequis
Si vous souhaitez suivre les exemples de cet article, vous avez besoin des éléments suivants.
- A computer running on a recent version of the Windows operating system. This article uses Windows 10 version 20H2.
- Windows PowerShell 5.1 ou PowerShell 6+. Les exemples de cet article utiliseront PowerShell v7.1.3.
- A sample PowerShell script for signing. Feel free to create a script with any name and in any folder you want. This article will use a sample script called C:\ATA\myscript.ps1 that contains the code below.
Obtention d’un certificat de signature de code
Avant d’apprendre à signer un script PowerShell, vous devez d’abord obtenir un certificat de signature de code. Dans le monde Microsoft, les certificats de signature de code sont également appelés certificats Authenticode.
A code signing certificate is one type of digital certificate whose purpose for signing files. Signing a file or code with a code signing certificate adds proof that the file came from the publisher who signed it.
L’endroit où vous obtenez un certificat de signature de code dépend de l’endroit où vous avez l’intention de déployer ou de distribuer vos scripts signés. Et comme toujours, le coût est également un facteur important.
- Global / Public – Vous aurez besoin d’un certificat dont l’émetteur est une autorité de certification (CA) mondialement reconnue. Des exemples de telles AC sont GeoTrust et DigiCert. Ces certificats ne sont pas gratuits. Par exemple, un certificat Authenticode de DigiCert vous coûtera 474 $ par an à la date de rédaction de cet article.
- Internal / Local Intranet – Si vous avez un serveur d’autorité de certification (CA) interne, vous pouvez demander et télécharger un certificat de signature depuis votre serveur CA interne.
- Personal / Development – Pour des tests personnels ou un usage de développement, un certificat auto-signé devrait suffire. C’est ce type de certificat de signature que vous utiliserez dans cet article.
Création d’un certificat auto-signé pour la signature de code
Vous avez lu dans la section précédente que, pour apprendre à signer un script PowerShell, vous avez d’abord besoin d’un certificat de signature de code. Comme vous ne ferez que des tests personnels dans ce tutoriel, un certificat auto-signé suffira. Mais où le trouver?
Comme son nom l’indique, auto-signé signifie que votre ordinateur local émettra un certificat de signature de code à lui-même. Pour générer un certificat auto-signé, suivez ces étapes.
1. Ouvrez PowerShell en tant qu’administrateur sur votre ordinateur.
2. Copiez la commande ci-dessous et exécutez-la dans PowerShell. Cette commande utilise la cmdlet New-SelfSignedCertificate
pour créer un nouveau certificat de signature de code. Le nom du certificat est ATA Authenticode dans le magasin de certificats personnels de l’ordinateur local.
La cmdlet
New-SelfSignedCertificate
ne prend en charge que la création de certificats dans le magasin de certificats personnels de l’utilisateur actuel (cert:\CurrentUser\My) ou dans le magasin de certificats personnels de l’ordinateur local (cert:\LocalMachine\My). Les certificats dans cert:\LocalMachine\My sont disponibles dans tout l’ordinateur.
La commande stocke également l’objet de certificat dans la variable $authenticode
pour une utilisation ultérieure.
3. Ensuite, pour que votre ordinateur fasse confiance au nouveau certificat que vous avez créé, ajoutez le certificat auto-signé au magasin de certificats de Autorité de certification racine de confiance et Éditeurs approuvés de confiance de l’ordinateur. Pour ce faire, copiez le code ci-dessous et exécutez-le dans PowerShell.
Il y a trois raisons principales d’installer les certificats auto-signés dans trois magasins de certificats différents.
- Le certificat que vous avez créé dans le magasin de certificats Personnel est celui que vous utiliserez comme certificat de signature de code.
- Copier le même certificat dans le magasin Éditeurs de confiance garantit que votre ordinateur local fera confiance à l’éditeur qui a signé le script. PowerShell vérifie la présence du certificat dans ce magasin pour valider la signature d’un script.
- Enfin, ajouter le certificat auto-signé aux Autorités de certification racine de confiance garantit que votre ordinateur local fait confiance aux certificats des magasins Personnel et Éditeurs de confiance.
4. Pour confirmer que le certificat avec le sujet ATA Authenticode est dans les magasins de certificats Personnel, Racine et Éditeurs de confiance de l’ordinateur, exécutez les commandes ci-dessous dans PowerShell.

5. Pour voir le certificat dans une interface graphique, ouvrez le module Compléments Certificats et recherchez le certificat que vous avez créé dans le dossier Certificats à l’intérieur des magasins de certificats Personnel, Autorités de certification racine de confiance, et Éditeurs de confiance.

Comment signer des scripts PowerShell
Maintenant que vous avez créé et installé votre certificat de signature de code dans les trois magasins de certificats, vous êtes prêt à l’utiliser pour signer votre script PowerShell d’exemple. Lorsque vous avez besoin de signer des scripts, la commande Set-AuthenticodeSignature
est la vedette principale.
Pour signer le script PowerShell, exécutez le code ci-dessous dans PowerShell. La première commande récupère le certificat de signature de code du magasin de certificats personnel de la machine locale. La deuxième commande ajoute une signature numérique au fichier de script PowerShell.
La plupart des fournisseurs de certificats de confiance ont un serveur d’horodatage et vous pouvez les trouver sur les sites Web des fournisseurs. Par exemple, le serveur d’horodatage de DigiCert est http://timestamp.digicert.com et Comodo a http://timestamp.comodoca.com.
Après avoir signé le script, vous devriez voir une sortie similaire à la capture d’écran ci-dessous.

Vérification de la signature numérique d’un script PowerShell
Jusqu’à présent, vous avez signé un script PowerShell en utilisant le certificat auto-signé que vous avez créé. Mais comment savez-vous si le script a bien une signature numérique?
Ouverture du code
Une façon de confirmer la signature numérique d’un script est d’ouvrir le script et de voir le code dans un éditeur de texte. Comme l’exemple ci-dessous, le script signé a un bloc de signature à la fin du code. Le bloc de signature commence par # SIG # Début du bloc de signature
et se termine par # SIG # Fin du bloc de signature
.

Supprimer le bloc de signature numérique du code du script le ramènera à sa version non signée.
Ouverture des propriétés du fichier du script
Une autre façon de vérifier la signature numérique du script est d’ouvrir les propriétés du fichier du script dans l’explorateur Windows. Pour ce faire:
- Explorateur Windows, accédez à l’emplacement du script PowerShell. Dans cet exemple, le script est dans C:\ATA\myscript.ps1.
- Cliquez avec le bouton droit sur le script et cliquez sur Propriétés.
- Dans la fenêtre des propriétés du fichier, cliquez sur l’onglet Signatures numériques, et vous devriez voir une signature numérique sous la Liste des signatures.

Utilisez la commande Get-AuthenticodeSignature
Seriez-vous surpris d’apprendre que vous pouvez également vérifier la signature d’un script à l’intérieur de PowerShell ? Probablement pas. La cmdlet que vous pouvez invoquer pour récupérer la signature d’un fichier est Get-AuthenticodeSignature
.
Pour obtenir la signature numérique du script, exécutez la commande ci-dessous. Cette commande récupère la signature du fichier C:\ATA\myscript.ps1. La cmdlet Select-Object -Property *
affiche tous les détails de la signature.
Après avoir exécuté la commande, vous devriez voir un résultat similaire à la capture d’écran ci-dessous. Comme vous pouvez le voir, la propriété SignerCertificate
montre les détails du certificat de signature. Alors que la propriété TimerStamperCertificate
montre le certificat du serveur de minutage.

Exécution d’un script PowerShell signé
À ce stade, vous avez signé un script PowerShell et confirmé que la signature numérique est présente. Mais, le test ultime pour savoir si vous avez suivi toutes les étapes correctement est d’exécuter le script et de confirmer qu’il s’exécute.
PowerShell dispose d’une fonctionnalité de sécurité qui protège les utilisateurs contre l’exécution involontaire de scripts. Cette fonctionnalité de sécurité est appelée Politiques d’exécution. Selon la politique d’exécution, PowerShell peut empêcher ou autoriser l’exécution de scripts.
Pour en savoir plus sur les différentes politiques d’exécution et leur impact sur l’exécution des scripts, consultez PowerShell Execution Policies: Understanding and Managing.
Pour exécuter un script PowerShell signé, suivez ces étapes.
Tout d’abord, modifiez la politique d’exécution en AllSigned pour garantir que seuls les scripts signés peuvent s’exécuter. Sans effectuer cette étape, vous ne pouvez pas tester avec précision si votre script signé fonctionne. Pour ce faire, invoquez la cmdlet Set-ExecutionPolicy
en exécutant la commande ci-dessous dans PowerShell en tant qu’administrateur.
Ensuite, exécutez le script PowerShell signé.
Le script devrait s’exécuter sans erreurs ni avertissements, comme vous pouvez le voir dans le résultat ci-dessous.

Mais, si par hasard le script n’était pas correctement signé ou pas signé du tout, vous obtiendrez une erreur similaire à l’image ci-dessous. Dans ce cas, reprenez vos étapes et essayez de signer à nouveau le script.

Et si vous avez finalement mis à jour votre script ? La signature numérique restera-t-elle valide ? La réponse est non. Toute modification apportée au script signé invalidera la signature numérique du script. L’exécution du script modifié échouera et entraînera une erreur.
Suivez ces étapes pour tester un script signé modifié.
1. Ouvrez le script signé myscript.ps1 dans un éditeur de code ou de texte.
2. Modifiez le code pour ajouter un caractère, comme un trait de soulignement dans cet exemple. Ne changez rien d’autre.

3. Enregistrez le script après avoir modifié le code.
4. Enfin, exécutez le script modifié dans PowerShell en exécutant la commande ci-dessous.
Étant donné que vous avez modifié le script signé, l’exécution du script entraînera l’erreur indiquée ci-dessous. Vous devrez signer à nouveau le script pour mettre à jour et corriger sa signature numérique.

A digital signature does not guarantee that nobody modified the script from its original version. Any PowerShell script with malicious code may be digitally signed, too. Always practice caution when running scripts from sources you do not fully trust.
Conclusion
Dans cet article, vous avez appris pourquoi il peut être nécessaire de signer des scripts PowerShell en fonction des politiques d’exécution. Vous avez également appris à distinguer un script signé d’un script non signé. Enfin, vous avez appris à signer numériquement des scripts PowerShell et comment les tester et les exécuter.
Maintenant que vous savez comment signer des scripts PowerShell, allez-vous commencer à signer les scripts avant de les distribuer ou de les déployer ?
Source:
https://adamtheautomator.com/how-to-sign-powershell-script/