about_Signing
Korte beschrijving
Hierin wordt uitgelegd hoe u scripts kunt ondertekenen zodat ze voldoen aan het PowerShell-uitvoeringsbeleid.
Lange beschrijving
Deze informatie is alleen van toepassing op PowerShell in Windows.
Het beleid voor beperkte uitvoering staat het uitvoeren van scripts niet toe. Het uitvoeringsbeleid AllSigned en RemoteSigned voorkomt dat PowerShell scripts uitvoert die geen digitale handtekening hebben.
In dit onderwerp wordt uitgelegd hoe u geselecteerde scripts uitvoert die niet zijn ondertekend, zelfs als het uitvoeringsbeleid RemoteSigned is en hoe u scripts voor eigen gebruik kunt ondertekenen.
Zie about_Execution_Policies voor meer informatie over powershell-uitvoeringsbeleid.
De uitvoering van ondertekende scripts toestaan
Wanneer u PowerShell voor de eerste keer op een computer start, is het beleid voor beperkte uitvoering waarschijnlijk van kracht. Dit is de standaardinstelling.
Het beperkte beleid staat het uitvoeren van scripts niet toe.
Als u het effectieve uitvoeringsbeleid op uw computer wilt vinden, typt u:
Get-ExecutionPolicy
Als u niet-ondertekende scripts wilt uitvoeren die u op uw lokale computer schrijft en scripts van andere gebruikers hebt ondertekend, start u PowerShell met de optie Als administrator uitvoeren en gebruikt u vervolgens de volgende opdracht om het uitvoeringsbeleid op de computer te wijzigen in RemoteSigned:
Set-ExecutionPolicy RemoteSigned
Zie het Help-onderwerp voor de Set-ExecutionPolicy
cmdlet voor meer informatie.
Niet-ondertekende scripts uitvoeren met behulp van het RemoteSigned-uitvoeringsbeleid
Als uw PowerShell-uitvoeringsbeleid RemoteSigned is, voert PowerShell geen niet-ondertekende scripts uit die zijn gedownload van internet, met inbegrip van niet-ondertekende scripts die u ontvangt via e-mail en chatprogramma's.
Als u een gedownload script probeert uit te voeren, wordt het volgende foutbericht weergegeven in 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.
Voordat u het script uitvoert, controleert u de code om er zeker van te zijn dat u deze vertrouwt. Scripts hebben hetzelfde effect als elk uitvoerbaar programma.
Als u een niet-ondertekend script wilt uitvoeren, gebruikt u de Unblock-File
cmdlet of gebruikt u de volgende procedure.
- Sla het scriptbestand op uw computer op.
- Klik op Start, klik op Mijn computer en zoek het opgeslagen scriptbestand.
- Klik met de rechtermuisknop op het scriptbestand en klik vervolgens op Eigenschappen.
- Klik op Blokkering opheffen.
Als een script dat is gedownload van internet digitaal is ondertekend, maar u er nog niet voor hebt gekozen om de uitgever ervan te vertrouwen, wordt het volgende bericht weergegeven in PowerShell:
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"):
Als u de uitgever vertrouwt, selecteert u Eenmaal uitvoeren of Altijd uitvoeren. Als u de uitgever niet vertrouwt, selecteert u Nooit uitvoeren of Niet uitvoeren. Als u Nooit uitvoeren of Altijd uitvoeren selecteert, wordt u niet opnieuw gevraagd om deze uitgever.
Methoden voor het ondertekenen van scripts
U kunt de scripts ondertekenen die u schrijft en de scripts die u uit andere bronnen krijgt. Voordat u een script ondertekent, controleert u elke opdracht om te controleren of deze veilig kan worden uitgevoerd.
Zie Aanbevolen procedures voor code-ondertekening voor aanbevolen procedures voor het ondertekenen van code.
Zie Set-AuthenticodeSignature voor meer informatie over het ondertekenen van een scriptbestand.
De New-SelfSignedCertificate
cmdlet, geïntroduceerd in de PKI-module in PowerShell 3.0, maakt een zelfondertekend certificaat dat geschikt is voor testen. Zie het Help-onderwerp voor de New-SelfSignedCertificate
cmdlet voor meer informatie.
Als u een digitale handtekening wilt toevoegen aan een script, moet u deze ondertekenen met een certificaat voor ondertekening van code. Twee soorten certificaten zijn geschikt voor het ondertekenen van een scriptbestand:
Certificaten die zijn gemaakt door een certificeringsinstantie: tegen betaling verifieert een openbare certificeringsinstantie uw identiteit en krijgt u een certificaat voor ondertekening van code. Wanneer u uw certificaat aanschaft bij een betrouwbare certificeringsinstantie, kunt u uw script delen met gebruikers op andere computers waarop Windows wordt uitgevoerd, omdat deze andere computers de certificeringsinstantie vertrouwen.
Certificaten die u maakt: u kunt een zelfondertekend certificaat maken waarvoor uw computer de instantie is die het certificaat maakt. Dit certificaat is gratis en stelt u in staat scripts op uw computer te schrijven, te ondertekenen en uit te voeren. Een script dat is ondertekend door een zelfondertekend certificaat, wordt echter niet uitgevoerd op andere computers.
Normaal gesproken gebruikt u een zelfondertekend certificaat alleen om scripts te ondertekenen die u voor eigen gebruik schrijft en om scripts te ondertekenen die u krijgt van andere bronnen die u hebt geverifieerd als veilig. Het is niet geschikt voor scripts die worden gedeeld, zelfs niet binnen een onderneming.
Als u een zelfondertekend certificaat maakt, moet u beveiliging met een sterke persoonlijke sleutel inschakelen voor uw certificaat. Dit voorkomt dat schadelijke programma's scripts namens u ondertekenen. De instructies staan aan het einde van dit onderwerp.
Een zelfondertekend certificaat maken
Als u een zelfondertekend certificaat wilt maken, gebruikt u de cmdlet New-SelfSignedCertificate in de PKI-module. Deze module is geïntroduceerd in PowerShell 3.0. Zie het Help-onderwerp voor de New-SelfSignedCertificate
cmdlet voor meer informatie.
$params = @{
Subject = 'CN=PowerShell Code Signing Cert'
Type = 'CodeSigning'
CertStoreLocation = 'Cert:\CurrentUser\My'
HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params
Makecert.exe gebruiken
Als u een zelfondertekend certificaat wilt maken in eerdere versies van Windows, gebruikt u het hulpprogramma MakeCert.exe
voor het maken van certificaten. Dit hulpprogramma is opgenomen in de Microsoft .NET SDK (versies 1.1 en hoger) en in de Microsoft Windows SDK.
Zie Hulpprogramma voor het maken van certificaten (MakeCert.exe) voor meer informatie over de syntaxis en de parameterbeschrijvingen van het MakeCert.exe
hulpprogramma.
Als u het MakeCert.exe
hulpprogramma wilt gebruiken om een certificaat te maken, voert u de volgende opdrachten uit in een SDK-opdrachtpromptvenster.
Notitie
Met de eerste opdracht maakt u een lokale certificeringsinstantie voor uw computer. Met de tweede opdracht wordt een persoonlijk certificaat van de certificeringsinstantie gegenereerd. U kunt de opdrachten precies kopiëren of typen zoals ze worden weergegeven. Er zijn geen vervangingen nodig, hoewel u de naam van het certificaat kunt wijzigen.
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
Het MakeCert.exe
hulpprogramma vraagt u om een wachtwoord voor een persoonlijke sleutel. Het wachtwoord zorgt ervoor dat niemand het certificaat kan gebruiken of openen zonder uw toestemming.
Creatie en voer een wachtwoord in dat u kunt onthouden. U gebruikt dit wachtwoord later om het certificaat op te halen.
Als u wilt controleren of het certificaat correct is gegenereerd, gebruikt u de volgende opdracht om het certificaat op te halen in het certificaatarchief op de computer. U vindt geen certificaatbestand in de bestandssysteemmap.
Typ bij de PowerShell-prompt:
Get-ChildItem cert:\CurrentUser\my -codesigning
Met deze opdracht wordt de PowerShell-certificaatprovider gebruikt om informatie over het certificaat weer te geven.
Als het certificaat is gemaakt, wordt in de uitvoer de vingerafdruk weergegeven die het certificaat identificeert in een scherm dat er ongeveer als volgt uitziet:
Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My
Thumbprint Subject
---------- -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF CN=PowerShell User ]
Een script ondertekenen
Nadat u een zelfondertekend certificaat hebt gemaakt, kunt u scripts ondertekenen. Als u het uitvoeringsbeleid AllSigned gebruikt, kunt u door een script te ondertekenen het script uitvoeren op uw computer.
Het volgende voorbeeldscript, Add-Signature.ps1
, ondertekent een script. Als u echter het uitvoeringsbeleid AllSigned gebruikt, moet u het Add-Signature.ps1
script ondertekenen voordat u het uitvoert.
Belangrijk
Vóór PowerShell 7.2 moet het script worden opgeslagen met ASCII- of UTF8NoBOM-codering. PowerShell 7.2 en hoger ondersteunt ondertekende scripts voor elke coderingsindeling.
Als u dit script wilt gebruiken, kopieert u de volgende tekst naar een tekstbestand en geeft u het Add-Signature.ps1
de naam .
## 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
Als u het Add-Signature.ps1
scriptbestand wilt ondertekenen, typt u de volgende opdrachten bij de PowerShell-opdrachtprompt:
$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
Select-Object -First 1
Set-AuthenticodeSignature add-signature.ps1 $cert
Nadat u het script hebt ondertekend, kunt u het uitvoeren op de lokale computer. Het script wordt echter niet uitgevoerd op computers waarvoor het PowerShell-uitvoeringsbeleid een digitale handtekening van een vertrouwde instantie vereist. Als u het probeert, wordt in PowerShell het volgende foutbericht weergegeven:
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 <<<<
Als PowerShell dit bericht weergeeft wanneer u een script uitvoert dat u niet hebt geschreven, behandelt u het bestand zoals elk niet-ondertekend script. Controleer de code om te bepalen of u het script kunt vertrouwen.
Sterke beveiliging inschakelen voor uw persoonlijke sleutel
Als u een persoonlijke sleutel en certificaat op uw computer hebt, kunnen schadelijke programma's mogelijk scripts namens u ondertekenen, waardoor PowerShell deze kan uitvoeren.
Als u geautomatiseerde ondertekening namens u wilt voorkomen, gebruikt u Certificaatbeheer Certmgr.exe
om uw ondertekeningssleutel en certificaat naar een .pfx
bestand te exporteren.
Certificate Manager is opgenomen in de Microsoft .NET SDK, de Microsoft Windows SDK en in Internet Explorer.
Het certificaat exporteren:
- Start Certificaatbeheer.
- Selecteer het certificaat dat is uitgegeven door de lokale PowerShell-certificaathoofdmap.
- Klik op Exporteren om de wizard Certificaat exporteren te starten.
- Selecteer Ja, de persoonlijke sleutel exporteren en klik vervolgens op Volgende.
- Selecteer Sterke beveiliging inschakelen.
- Typ een wachtwoord en typ het nogmaals om te bevestigen.
- Typ een bestandsnaam met de
.pfx
bestandsnaamextensie. - Klik op Voltooien.
Het certificaat opnieuw importeren:
- Start Certificaatbeheer.
- Klik op Importeren om de wizard Certificaat importeren te starten.
- Open naar de locatie van het
.pfx
bestand dat u tijdens het exportproces hebt gemaakt. - Selecteer op de pagina Wachtwoord de optie Beveiliging met sterke persoonlijke sleutel inschakelen en voer vervolgens het wachtwoord in dat u tijdens het exportproces hebt toegewezen.
- Selecteer het persoonlijke certificaatarchief.
- Klik op Voltooien.
Voorkomen dat de handtekening verloopt
De digitale handtekening in een script is geldig totdat het handtekeningcertificaat verloopt of zolang een tijdstempelserver kan verifiëren dat het script is ondertekend terwijl het handtekeningcertificaat geldig was.
Omdat de meeste ondertekeningscertificaten slechts één jaar geldig zijn, zorgt het gebruik van een tijdstempelserver ervoor dat gebruikers uw script nog vele jaren kunnen gebruiken.