about_Signing

Korte beschrijving

Legt uit hoe u scripts ondertekent zodat ze voldoen aan het PowerShell-uitvoeringsbeleid.

Lange beschrijving

Het beleid voor beperkte uitvoering staat niet toe dat scripts worden uitgevoerd. Het uitvoeringsbeleid AllSigned en RemoteSigned verhinderen dat PowerShell scripts kan uitvoeren die geen digitale handtekening hebben.

In dit onderwerp wordt uitgelegd hoe u geselecteerde scripts kunt uitvoeren die niet zijn ondertekend, zelfs als het uitvoeringsbeleid RemoteSigned is, en hoe u scripts ondertekent voor uw eigen gebruik.

Zie voor meer informatie over PowerShell-uitvoeringsbeleid about_Execution_Policies.

Ondertekende scripts toestaan uit te voeren

Wanneer u PowerShell voor het eerst op een computer start, is het beleid voor beperkte uitvoering (de standaardinstelling) waarschijnlijk van kracht.

Het beperkte beleid staat niet toe dat scripts worden uitgevoerd.

Als u wilt zoeken naar het effectieve uitvoeringsbeleid op uw computer, typt u:

Get-ExecutionPolicy

Als u niet-ondertekende scripts die u schrijft op uw lokale computer en ondertekende scripts van andere gebruikers wilt uitvoeren, 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 uitvoeringsbeleid RemoteSigned

Als uw PowerShell-uitvoeringsbeleid RemoteSigned is, worden in PowerShell geen niet-ondertekende scripts uitgevoerd die van internet worden gedownload, inclusief niet-ondertekende scripts die u via e-mail en chatprogramma's ontvangt.

Als u een gedownload script probeert uit te voeren, wordt in PowerShell het volgende foutbericht weergegeven:

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 gaat uitvoeren, controleert u de code om er zeker van te zijn dat u het vertrouwt. Scripts hebben hetzelfde effect als elk uitvoerbaar programma.

Als u een niet-ondertekend script wilt uitvoeren, gebruikt u Unblock-File cmdlet of gebruikt u de volgende procedure.

  1. Sla het scriptbestand op uw computer op.
  2. Klik op Start, klik op Mijn computer en zoek het opgeslagen scriptbestand.
  3. Klik met de rechtermuisknop op het scriptbestand en klik vervolgens op Eigenschappen.
  4. Klik op Blokkering opheffen.

Als een script dat is gedownload van internet digitaal is ondertekend, maar u nog niet hebt gekozen om de uitgever ervan te vertrouwen, wordt in PowerShell het volgende bericht weergegeven:

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 in PowerShell niet opnieuw om deze uitgever gevraagd.

Methoden voor het ondertekenen van scripts

U kunt de scripts die u schrijft en de scripts die u van andere bronnen verkrijgt, ondertekenen. Voordat u een script ondertekent, controleert u elke opdracht om te controleren of het veilig is om uit te voeren.

Zie Best practices voor ondertekening van programmacode voor best practices voor ondertekening van programmacode.

Zie Set-AuthenticodeSignaturevoor meer informatie over het ondertekenen van een scriptbestand.

De New-SelfSignedCertificate cmdlet, geïntroduceerd in de PKI-module in PowerShell 3.0, maakt een zelf-ondertekend certificaat dat geschikt is voor testen. Zie het Help-onderwerp voor de New-SelfSignedCertificate cmdlet voor meer informatie.

Als u een digitale handtekening aan een script wilt toevoegen, moet u deze ondertekenen met een certificaat voor ondertekening van programmacode. Er zijn twee typen certificaten die geschikt zijn voor het ondertekenen van een scriptbestand:

  • Certificaten die zijn gemaakt door een certificeringsinstantie: tegen een vergoeding verifieert een openbare certificeringsinstantie uw identiteit en geeft u een certificaat voor ondertekening van programmacode. Wanneer u uw certificaat aanschaft bij een betrouwbare certificeringsinstantie, kunt u uw script delen met gebruikers op andere computers met Windows omdat die andere computers de certificeringsinstantie vertrouwen.

  • Certificaten die u maakt: u kunt een zelf-ondertekend certificaat maken waarvoor uw computer de instantie is die het certificaat maakt. Dit certificaat is gratis en stelt u in staat om scripts te schrijven, te ondertekenen en uit te voeren op uw computer. Een script dat is ondertekend door een zelf-ondertekend certificaat wordt echter niet uitgevoerd op andere computers.

Normaal gesproken gebruikt u een zelf-ondertekend certificaat alleen om scripts te ondertekenen die u voor uw eigen gebruik schrijft en om scripts te ondertekenen die u krijgt van andere bronnen die u als veilig hebt geverifieerd. Het is niet geschikt voor scripts die worden gedeeld, zelfs niet binnen een onderneming.

Als u een zelf-ondertekend certificaat maakt, moet u beveiliging met sterke persoonlijke sleutels inschakelen voor uw certificaat. Dit voorkomt dat schadelijke programma's namens u scripts ondertekenen. De instructies zijn aan het einde van dit onderwerp opgenomen.

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 en is opgenomen in Windows 8 en Windows Server 2012. 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

Met Makecert.exe

Als u een zelf-ondertekend certificaat wilt maken in eerdere versies van Windows, gebruikt u het hulpprogramma voor het maken van MakeCert.exe certificaten. Dit hulpprogramma is opgenomen in de Microsoft .NET SDK (versie 1.1 en hoger) en in de Microsoft Windows SDK.

Zie Hulpprogramma voor het maken van certificaten (MakeCert.exe) voor meer informatie over de MakeCert.exe syntaxis en de parameterbeschrijvingen van het hulpprogramma.

Als u het hulpprogramma MakeCert.exe 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. De tweede opdracht genereert een persoonlijk certificaat van de certificeringsinstantie. U kunt de opdrachten exact zo kopiëren of typen als ze worden weergegeven. Er zijn geen vervangingen nodig, hoewel u de certificaatnaam 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 de persoonlijke sleutel. Het wachtwoord zorgt ervoor dat niemand het certificaat kan gebruiken of openen zonder uw toestemming. Maak 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 certificaatopslag op de computer. U vindt geen certificaatbestand in de map van het bestandssysteem.

Typ het volgende 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, toont de uitvoer de vingerafdruk die het certificaat identificeert in een weergave die er als volgt uit ziet:

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

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

Een script ondertekenen

Nadat u een zelf-ondertekend certificaat hebt maken, kunt u scripts ondertekenen. Als u het uitvoeringsbeleid AllSigned gebruikt, kunt u met het ondertekenen van een script 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 script ondertekenen Add-Signature.ps1 voordat u het kunt uitvoeren.

Belangrijk

Het script moet worden opgeslagen met ASCII- of UTF8NoLIST-codering. U kunt een scriptbestand ondertekenen dat gebruikmaakt van een andere codering. Maar het script kan niet worden uitgevoerd of de module met het script kan niet worden geïmporteerd.

Als u dit script wilt gebruiken, kopieert u de volgende tekst naar een tekstbestand en geeft u het de naam Add-Signature.ps1 .

## Signs a file
param([string] $file=$(throw "Please specify a filename."))
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature $file $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 -codesigning)[0]
Set-AuthenticodeSignature add-signature.ps1 $cert

Nadat het script is ondertekend, kunt u het uitvoeren op de lokale computer. Het script wordt echter niet uitgevoerd op computers waarop 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 wekt wanneer u een script dat u niet hebt geschreven, wordt uitgevoerd, behandelt u het bestand zoals u elk niet-ondertekend script zou behandelen. Controleer de code om te bepalen of u het script kunt vertrouwen.

Sterke beveiliging van persoonlijke sleutels inschakelen voor uw certificaat

Als u een persoonlijk certificaat op uw computer hebt, kunnen kwaadwillende programma's mogelijk namens u scripts ondertekenen, waardoor PowerShell wordt gemachtigd om ze uit te voeren.

Als u namens u automatische ondertekening wilt voorkomen, gebruikt u Certificaatbeheer Certmgr.exe om uw handtekeningcertificaat te exporteren naar een .pfx bestand. Certificate Manager is opgenomen in de Microsoft .NET SDK, de Microsoft Windows SDK en in Internet Explorer.

Het certificaat exporteren:

  1. Start Certificate Manager.
  2. Selecteer het certificaat dat is uitgegeven door de hoofdmap van het lokale PowerShell-certificaat.
  3. Klik op Exporteren om de wizard Certificaat exporteren te starten.
  4. Selecteer Ja, de persoonlijke sleutel exporteren en klik vervolgens op Volgende.
  5. Selecteer 'Sterke beveiliging inschakelen'.
  6. Typ een wachtwoord en typ het nogmaals om te bevestigen.
  7. Typ een bestandsnaam met de bestandsextensie .pfx.
  8. Klik op Voltooien.

Het certificaat opnieuw importeren:

  1. Start Certificaatbeheer.
  2. Klik op Importeren om de wizard Certificaat importeren te starten.
  3. Open naar de locatie van het PFX-bestand dat u tijdens het exportproces hebt gemaakt.
  4. Selecteer op de pagina Wachtwoord de optie Beveiliging met sterke persoonlijke sleutel inschakelen en voer het wachtwoord in dat u tijdens het exportproces hebt toegewezen.
  5. Selecteer het persoonlijke certificaatopslag.
  6. 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 controleren of het script is ondertekend terwijl het handtekeningcertificaat geldig was.

Omdat de meeste handtekeningcertificaten slechts één jaar geldig zijn, zorgt het gebruik van een tijdstempelserver ervoor dat gebruikers uw script nog vele jaren kunnen gebruiken.

Zie ook

about_Execution_Policies

about_Profiles

Get-ExecutionPolicy

Set-ExecutionPolicy

Set-AuthenticodeSignature

Inleiding tot ondertekening van programmacode