Partager via


about_Signing

Description courte

Explique comment signer des scripts afin qu’ils soient conformes aux stratégies d’exécution de PowerShell.

Description longue

Ces informations s’appliquent uniquement à PowerShell exécuté sur Windows.

La stratégie d’exécution restreinte n’autorise pas l’exécution de scripts. Les stratégies d’exécution AllSigned et RemoteSigned empêchent PowerShell d’exécuter des scripts qui n’ont pas de signature numérique.

Cette rubrique explique comment exécuter des scripts sélectionnés qui ne sont pas signés, même si la stratégie d’exécution est RemoteSigned, et comment signer des scripts pour votre propre utilisation.

Pour plus d’informations sur les stratégies d’exécution de PowerShell, consultez about_Execution_Policies.

Pour autoriser l’exécution de scripts signés

Lorsque vous démarrez PowerShell sur un ordinateur pour la première fois, la stratégie d’exécution restreinte , qui est la valeur par défaut, est susceptible d’être appliquée.

La stratégie Restreinte n’autorise pas l’exécution de scripts.

Pour trouver la stratégie d’exécution effective sur votre ordinateur, tapez :

Get-ExecutionPolicy

Pour exécuter des scripts non signés que vous écrivez sur votre ordinateur local et des scripts signés d’autres utilisateurs, démarrez PowerShell avec l’option Exécuter en tant qu’administrateur , puis utilisez la commande suivante pour modifier la stratégie d’exécution sur l’ordinateur en RemoteSigned :

Set-ExecutionPolicy RemoteSigned

Pour plus d’informations, consultez la rubrique d’aide relative à l’applet de Set-ExecutionPolicy commande.

Exécution de scripts non signés à l’aide de la stratégie d’exécution RemoteSigned

Si votre stratégie d’exécution PowerShell est RemoteSigned, PowerShell n’exécute pas les scripts non signés téléchargés à partir d’Internet, y compris les scripts non signés que vous recevez par e-mail et par des programmes de messagerie instantanée.

Si vous essayez d’exécuter un script téléchargé, PowerShell affiche le message d’erreur suivant :

The file <file-name> cannot be loaded. The file <file-name> is not
digitally signed. The script will not execute on the system. Please see
"Get-Help about_Signing" for more details.

Avant d’exécuter le script, passez en revue le code pour être sûr de lui faire confiance. Les scripts ont le même effet que n’importe quel programme exécutable.

Pour exécuter un script non signé, utilisez l’applet de Unblock-File commande ou utilisez la procédure suivante.

  1. Enregistrez le fichier de script sur votre ordinateur.
  2. Cliquez sur Démarrer, cliquez sur Poste de travail, puis recherchez le fichier de script enregistré.
  3. Cliquez avec le bouton droit sur le fichier de script, puis cliquez sur Propriétés.
  4. Cliquez sur Débloquer.

Si un script téléchargé à partir d’Internet est signé numériquement, mais que vous n’avez pas encore choisi d’approuver son éditeur, PowerShell affiche le message suivant :

Do you want to run software from this untrusted publisher?
The file <file-name> is published by CN=<publisher-name>. This
publisher is not trusted on your system. Only run scripts
from trusted publishers.

[V] Never run  [D] Do not run  [R] Run once  [A] Always run
[?] Help (default is "D"):

Si vous faites confiance au serveur de publication, sélectionnez Exécuter une seule fois ou Toujours exécuter. Si vous n’approuvez pas le serveur de publication, sélectionnez Jamais exécuter ou Ne pas exécuter. Si vous sélectionnez Ne jamais exécuter ou Toujours exécuter, PowerShell ne vous invite pas à entrer à nouveau cet éditeur.

Méthodes de signature de scripts

Vous pouvez signer les scripts que vous écrivez et les scripts que vous obtenez d’autres sources. Avant de signer un script, examinez chaque commande pour vérifier qu’elle peut s’exécuter en toute sécurité.

Pour connaître les meilleures pratiques relatives à la signature de code, consultez Meilleures pratiques de signature de code.

Pour plus d’informations sur la signature d’un fichier de script, consultez Set-AuthenticodeSignature.

L’applet New-SelfSignedCertificate de commande, introduite dans le module PKI dans PowerShell 3.0, crée un certificat auto-signé approprié pour les tests. Pour plus d’informations, consultez la rubrique d’aide relative à l’applet de New-SelfSignedCertificate commande.

Pour ajouter une signature numérique à un script, vous devez la signer avec un certificat de signature de code. Deux types de certificats conviennent pour la signature d’un fichier de script :

  • Certificats créés par une autorité de certification : moyennant des frais, une autorité de certification publique vérifie votre identité et vous fournit un certificat de signature de code. Lorsque vous achetez votre certificat auprès d’une autorité de certification digne de confiance, vous pouvez partager votre script avec des utilisateurs sur d’autres ordinateurs qui exécutent Windows, car ces autres ordinateurs font confiance à l’autorité de certification.

  • Certificats que vous créez : vous pouvez créer un certificat auto-signé pour lequel votre ordinateur est l’autorité qui crée le certificat. Ce certificat est gratuit et vous permet d’écrire, de signer et d’exécuter des scripts sur votre ordinateur. Toutefois, un script signé par un certificat auto-signé ne s’exécute pas sur d’autres ordinateurs.

En règle générale, vous utilisez un certificat auto-signé uniquement pour signer les scripts que vous écrivez pour votre propre usage et pour signer les scripts que vous obtenez d’autres sources que vous avez vérifiées comme étant sécurisées. Il n’est pas approprié pour les scripts qui seront partagés, même au sein d’une entreprise.

Si vous créez un certificat auto-signé, veillez à activer une protection forte par clé privée sur votre certificat. Cela empêche les programmes malveillants de signer des scripts en votre nom. Les instructions sont incluses à la fin de cette rubrique.

Créer un certificat auto-signé

Pour créer un certificat auto-signé, utilisez l’applet de commande New-SelfSignedCertificate dans le module PKI. Ce module est introduit dans PowerShell 3.0. Pour plus d’informations, consultez la rubrique d’aide relative à l’applet de New-SelfSignedCertificate commande.

$params = @{
    Subject = 'CN=PowerShell Code Signing Cert'
    Type = 'CodeSigning'
    CertStoreLocation = 'Cert:\CurrentUser\My'
    HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params

Utilisation de Makecert.exe

Pour créer un certificat auto-signé dans des versions antérieures de Windows, utilisez l’outil MakeCert.exede création de certificats . Cet outil est inclus dans le Kit de développement logiciel (SDK) Microsoft .NET (versions 1.1 et ultérieures) et dans le Microsoft Windows SDK.

Pour plus d’informations sur la syntaxe et les descriptions de paramètres de l’outilMakeCert.exe, consultez Outil de création de certificats (MakeCert.exe).

Pour utiliser l’outil MakeCert.exe pour créer un certificat, exécutez les commandes suivantes dans une fenêtre d’invite de commandes du SDK.

Notes

La première commande crée une autorité de certification locale pour votre ordinateur. La deuxième commande génère un certificat personnel de l’autorité de certification. Vous pouvez copier ou taper les commandes exactement telles qu’elles s’affichent. Aucune substitution n’est nécessaire, bien que vous puissiez modifier le nom du certificat.

makecert -n "CN=PowerShell Local Certificate Root" -a sha256 `
-eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer `
-ss Root -sr localMachine

makecert -pe -n "CN=PowerShell User" -ss MY -a sha256 `
-eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

L’outil MakeCert.exe vous invite à entrer un mot de passe de clé privée. Le mot de passe garantit que personne ne peut utiliser le certificat ou y accéder sans votre consentement. Create et entrez un mot de passe dont vous vous souvenez. Vous utiliserez ce mot de passe ultérieurement pour récupérer le certificat.

Pour vérifier que le certificat a été généré correctement, utilisez la commande suivante pour obtenir le certificat dans le magasin de certificats sur l’ordinateur. Vous ne trouverez pas de fichier de certificat dans le répertoire du système de fichiers.

À l’invite PowerShell, tapez :

Get-ChildItem cert:\CurrentUser\my -codesigning

Cette commande utilise le fournisseur de certificats PowerShell pour afficher des informations sur le certificat.

Si le certificat a été créé, la sortie affiche l’empreinte numérique qui identifie le certificat dans un affichage semblable à ce qui suit :

Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

Thumbprint                                Subject
----------                                -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF  CN=PowerShell User ]

Signer un script

Après avoir créé un certificat auto-signé, vous pouvez signer des scripts. Si vous utilisez la stratégie d’exécution AllSigned , la signature d’un script vous permet d’exécuter le script sur votre ordinateur.

L’exemple de script suivant, Add-Signature.ps1, signe un script. Toutefois, si vous utilisez la stratégie d’exécution AllSigned , vous devez signer le script avant de l’exécuter Add-Signature.ps1 .

Important

Avant PowerShell 7.2, le script doit être enregistré à l’aide de l’encodage ASCII ou UTF8NoBOM. PowerShell 7.2 et versions ultérieures prend en charge les scripts signés pour n’importe quel format d’encodage.

Pour utiliser ce script, copiez le texte suivant dans un fichier texte et nommez-le Add-Signature.ps1.

## Signs a file
[cmdletbinding()]
param(
    [Parameter(Mandatory=$true)]
    [string] $File
)

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature -FilePath $File -Certificate $cert

Pour signer le fichier de Add-Signature.ps1 script, tapez les commandes suivantes à l’invite de commandes PowerShell :

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature add-signature.ps1 $cert

Après avoir signé le script, vous pouvez l’exécuter sur l’ordinateur local. Toutefois, le script ne s’exécute pas sur les ordinateurs où la stratégie d’exécution de PowerShell nécessite une signature numérique d’une autorité approuvée. Si vous essayez, PowerShell affiche le message d’erreur suivant :

The file C:\remote_file.ps1 cannot be loaded. The signature of the
certificate cannot be verified.
At line:1 char:15
+ .\ remote_file.ps1 <<<<

Si PowerShell affiche ce message lorsque vous exécutez un script que vous n’avez pas écrit, traitez le fichier comme vous traitez n’importe quel script non signé. Passez en revue le code pour déterminer si vous pouvez faire confiance au script.

Activer une protection forte pour votre clé privée

Si vous avez une clé privée et un certificat sur votre ordinateur, les programmes malveillants peuvent être en mesure de signer des scripts en votre nom, ce qui autorise PowerShell à les exécuter.

Pour empêcher la signature automatisée en votre nom, utilisez le Gestionnaire de certificats Certmgr.exe pour exporter votre clé de signature et votre certificat vers un .pfx fichier. Le Gestionnaire de certificats est inclus dans le Kit de développement logiciel (SDK) Microsoft .NET, le Microsoft Windows SDK et dans les Explorer Internet.

Pour exporter le certificat :

  1. Démarrez le Gestionnaire de certificats.
  2. Sélectionnez le certificat émis par la racine du certificat local PowerShell.
  3. Cliquez sur Exporter pour démarrer l’Assistant Exportation de certificat.
  4. Sélectionnez Oui, exporter la clé privée, puis cliquez sur Suivant.
  5. Sélectionnez Activer une protection forte.
  6. Tapez un mot de passe, puis tapez-le à nouveau pour confirmer.
  7. Tapez un nom de fichier qui a l’extension .pfx de nom de fichier.
  8. Cliquez sur Terminer.

Pour réimporter le certificat :

  1. Démarrez le Gestionnaire de certificats.
  2. Cliquez sur Importer pour démarrer l’Assistant Importation de certificat.
  3. Ouvrez à l’emplacement du .pfx fichier que vous avez créé pendant le processus d’exportation.
  4. Dans la page Mot de passe, sélectionnez Activer la protection forte par clé privée, puis entrez le mot de passe que vous avez attribué pendant le processus d’exportation.
  5. Sélectionnez le magasin de certificats Personnel.
  6. Cliquez sur Terminer.

Empêcher l’expiration de la signature

La signature numérique dans un script est valide jusqu’à l’expiration du certificat de signature ou tant qu’un serveur d’horodatage peut vérifier que le script a été signé alors que le certificat de signature était valide.

Étant donné que la plupart des certificats de signature ne sont valides que pour un an, l’utilisation d’un serveur d’horodatage garantit que les utilisateurs peuvent utiliser votre script pendant de nombreuses années à venir.

Voir aussi