about_Signing

Kort beskrivning

Förklarar hur du signerar skript så att de följer PowerShell-körningsprinciperna.

Lång beskrivning

Den här informationen gäller endast för PowerShell som körs i Windows.

Principen för begränsad körning tillåter inte att skript körs. Körningsprinciperna AllSigned och RemoteSigned hindrar PowerShell från att köra skript som inte har en digital signatur.

Det här avsnittet beskriver hur du kör valda skript som inte är signerade, även om körningsprincipen är RemoteSigned och hur du signerar skript för eget bruk.

Mer information om PowerShell-körningsprinciper finns i about_Execution_Policies.

Så här tillåter du att signerade skript körs

När du startar PowerShell på en dator för första gången kommer principen för begränsad körning, som är standard, sannolikt att gälla.

Principen Begränsad tillåter inte att skript körs.

Om du vill hitta den effektiva körningsprincipen på datorn skriver du:

Get-ExecutionPolicy

Om du vill köra osignerade skript som du skriver på din lokala dator och signerade skript från andra användare startar du PowerShell med alternativet Kör som administratör och använder sedan följande kommando för att ändra körningsprincipen på datorn till RemoteSigned:

Set-ExecutionPolicy RemoteSigned

Mer information finns i hjälpavsnittet för cmdleten Set-ExecutionPolicy .

Köra osignerade skript med hjälp av körningsprincipen RemoteSigned

Om din PowerShell-körningsprincip är RemoteSigned kör PowerShell inte osignerade skript som laddas ned från Internet, inklusive osignerade skript som du får via e-post- och snabbmeddelandeprogram.

Om du försöker köra ett nedladdat skript visas följande felmeddelande i PowerShell:

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.

Innan du kör skriptet granskar du koden för att vara säker på att du litar på den. Skript har samma effekt som alla körbara program.

Om du vill köra ett osignerat skript använder du cmdleten Unblock-File eller använder följande procedur.

  1. Spara skriptfilen på datorn.
  2. Klicka på Start, klicka på Min dator och leta upp den sparade skriptfilen.
  3. Högerklicka på skriptfilen och klicka sedan på Egenskaper.
  4. Klicka på Avblockera.

Om ett skript som har laddats ned från Internet är digitalt signerat, men du ännu inte har valt att lita på utgivaren, visar PowerShell följande meddelande:

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"):

Om du litar på utgivaren väljer du Kör en gång eller Kör alltid. Om du inte litar på utgivaren väljer du Antingen Kör aldrig eller Kör inte. Om du väljer Kör aldrig eller Kör alltid kommer PowerShell inte att fråga dig igen för den här utgivaren.

Metoder för signeringsskript

Du kan signera skripten som du skriver och de skript som du får från andra källor. Innan du signerar ett skript granskar du varje kommando för att kontrollera att det är säkert att köra.

Metodtips för kodsignering finns i Metodtips för kodsignering.

Mer information om hur du signerar en skriptfil finns i Set-AuthenticodeSignature.

Cmdleten New-SelfSignedCertificate , som introducerades i PKI-modulen i PowerShell 3.0, skapar ett självsignerat certifikat som är lämpligt för testning. Mer information finns i hjälpavsnittet för cmdleten New-SelfSignedCertificate .

Om du vill lägga till en digital signatur i ett skript måste du signera den med ett kodsigneringscertifikat. Två typer av certifikat är lämpliga för signering av en skriptfil:

  • Certifikat som skapas av en certifikatutfärdare: Mot en avgift verifierar en offentlig certifikatutfärdare din identitet och ger dig ett kodsigneringscertifikat. När du köper certifikatet från en välrenommerad certifikatutfärdare kan du dela skriptet med användare på andra datorer som kör Windows eftersom de andra datorerna litar på certifikatutfärdare.

  • Certifikat som du skapar: Du kan skapa ett självsignerat certifikat som datorn är den utfärdare som skapar certifikatet för. Det här certifikatet är kostnadsfritt och gör att du kan skriva, signera och köra skript på datorn. Ett skript som signerats av ett självsignerat certifikat körs dock inte på andra datorer.

Vanligtvis använder du bara ett självsignerat certifikat för att signera skript som du skriver för egen användning och för att signera skript som du får från andra källor som du har verifierat är säkra. Det är inte lämpligt för skript som delas, inte ens inom ett företag.

Om du skapar ett självsignerat certifikat måste du aktivera starkt skydd av privata nycklar på certifikatet. Detta förhindrar att skadliga program signerar skript åt dig. Instruktionerna ingår i slutet av det här avsnittet.

Skapa ett självsignerat certifikat

Om du vill skapa ett självsignerat certifikat använder du cmdleten New-SelfSignedCertificate i PKI-modulen. Den här modulen introduceras i PowerShell 3.0. Mer information finns i hjälpavsnittet för cmdleten New-SelfSignedCertificate .

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

Använda Makecert.exe

Om du vill skapa ett självsignerat certifikat i tidigare versioner av Windows använder du verktyget MakeCert.exeSkapa certifikat . Det här verktyget ingår i Microsoft .NET SDK (version 1.1 och senare) och i Microsoft Windows SDK.

Mer information om syntaxen och parameterbeskrivningarna för verktyget finns i MakeCert.exe Verktyget för att skapa certifikat (MakeCert.exe).

Om du vill använda MakeCert.exe verktyget för att skapa ett certifikat kör du följande kommandon i ett SDK-kommandotolkfönster.

Kommentar

Det första kommandot skapar en lokal certifikatutfärdare för datorn. Det andra kommandot genererar ett personligt certifikat från certifikatutfärdare. Du kan kopiera eller skriva kommandona exakt som de visas. Inga ersättningar krävs, även om du kan ändra certifikatnamnet.

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

Verktyget MakeCert.exe uppmanar dig att ange ett lösenord för en privat nyckel. Lösenordet säkerställer att ingen kan använda eller komma åt certifikatet utan ditt medgivande. Skapa och ange ett lösenord som du kan komma ihåg. Du använder det här lösenordet senare för att hämta certifikatet.

Om du vill kontrollera att certifikatet har genererats korrekt använder du följande kommando för att hämta certifikatet i certifikatarkivet på datorn. Du hittar ingen certifikatfil i filsystemkatalogen.

I PowerShell-prompten skriver du:

Get-ChildItem cert:\CurrentUser\my -codesigning

Det här kommandot använder PowerShell-certifikatprovidern för att visa information om certifikatet.

Om certifikatet skapades visar utdata tumavtrycket som identifierar certifikatet i en visning som liknar följande:

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

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

Signera ett skript

När du har skapat ett självsignerat certifikat kan du signera skript. Om du använder körningsprincipen AllSigned kan du köra skriptet på datorn genom att signera ett skript.

Följande exempelskript, Add-Signature.ps1, signerar ett skript. Men om du använder körningsprincipen AllSigned måste du signera skriptet Add-Signature.ps1 innan du kör det.

Viktigt!

Innan PowerShell 7.2 måste skriptet sparas med ASCII- eller UTF8NoBOM-kodning. PowerShell 7.2 och senare stöder signerade skript för alla kodningsformat.

Om du vill använda det här skriptet kopierar du följande text till en textfil och namnger den 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

Om du vill signera Add-Signature.ps1 skriptfilen skriver du följande kommandon i PowerShell-kommandotolken:

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

Set-AuthenticodeSignature add-signature.ps1 $cert

När du har signerat skriptet kan du köra det på den lokala datorn. Skriptet körs dock inte på datorer där PowerShell-körningsprincipen kräver en digital signatur från en betrodd utfärdare. Om du försöker visar PowerShell följande felmeddelande:

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 <<<<

Om PowerShell visar det här meddelandet när du kör ett skript som du inte skrev behandlar du filen på samma sätt som med alla osignerade skript. Granska koden för att avgöra om du kan lita på skriptet.

Aktivera starkt skydd för din privata nyckel

Om du har en privat nyckel och ett certifikat på datorn kan skadliga program kanske signera skript åt dig, vilket ger PowerShell behörighet att köra dem.

Om du vill förhindra automatisk signering åt dig använder du Certifikathanteraren Certmgr.exe för att exportera signeringsnyckeln och certifikatet till en .pfx fil. Certificate Manager ingår i Microsoft .NET SDK, Microsoft Windows SDK och i Internet Explorer.

Så här exporterar du certifikatet:

  1. Starta Certifikathanteraren.
  2. Välj certifikatet som utfärdats av den lokala PowerShell-certifikatroten.
  3. Klicka på Exportera för att starta guiden Exportera certifikat.
  4. Välj Ja, exportera den privata nyckeln och klicka sedan på Nästa.
  5. Välj Aktivera starkt skydd.
  6. Skriv ett lösenord och skriv det sedan igen för att bekräfta.
  7. Skriv ett filnamn som har filnamnstillägget .pfx .
  8. Klicka på Finish.

Så här importerar du certifikatet igen:

  1. Starta Certifikathanteraren.
  2. Klicka på Importera för att starta guiden Importera certifikat.
  3. Öppna till platsen för filen .pfx som du skapade under exportprocessen.
  4. På sidan Lösenord väljer du Aktivera starkt skydd för privat nyckel och anger sedan lösenordet som du tilldelade under exportprocessen.
  5. Välj det personliga certifikatarkivet.
  6. Klicka på Finish.

Förhindra att signaturen upphör att gälla

Den digitala signaturen i ett skript är giltig tills signeringscertifikatet upphör att gälla eller så länge en tidsstämpelserver kan verifiera att skriptet signerades medan signeringscertifikatet var giltigt.

Eftersom de flesta signeringscertifikat endast är giltiga i ett år säkerställer användning av en tidsstämpelserver att användarna kan använda skriptet i många år framöver.

Se även