Delen via


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 die wordt uitgevoerd in Windows.

Het beperkte uitvoeringsbeleid staat niet toe dat scripts worden uitgevoerd. 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 het eerst op een computer start, is het uitvoeringsbeleid met beperkte toegang (de standaardinstelling) waarschijnlijk van kracht.

Het beleid Beperkt staat niet toe dat scripts worden uitgevoerd.

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, inclusief niet-ondertekende scripts die u ontvangt via e-mail en chatprogramma's.

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 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 cmdlet Unblock-File of gebruikt u de volgende procedure.

  1. Sla het scriptbestand op uw computer op.
  2. Klik op Start, klik op Deze 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 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 om deze uitgever gevraagd.

Methoden voor het ondertekenen van scripts

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

Zie Best practices voor het ondertekenen van code 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 cmdlet New-SelfSignedCertificate voor meer informatie.

Als u een digitale handtekening aan een script wilt toevoegen, moet u het ondertekenen met een certificaat voor ondertekening van code. Er zijn twee soorten 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 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. Dit 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 New-SelfSignedCertificate cmdlet in de PKI-module. Deze module is geïntroduceerd in PowerShell 3.0 en is opgenomen in Windows 8 en Windows Server 2012. Zie New-SelfSignedCertificate 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.exevoor 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 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 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 weergave die 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.

Met het volgende voorbeeldscript, Add-Signature.ps1, wordt een script ondertekend. Als u echter het uitvoeringsbeleid AllSigned gebruikt, moet u het Add-Signature.ps1 script ondertekenen voordat u het uitvoert.

Belangrijk

Het script moet worden opgeslagen met ASCII- of UTF8NoBOM-codering. U kunt een scriptbestand ondertekenen dat een andere codering gebruikt, maar het script kan niet worden uitgevoerd of de module met het script kan niet worden geïmporteerd. Het script mislukt ook als het bestand Unicode-tekens (UTF8) bevat.

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

## 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 weergeeft wanneer u een script uitvoert dat u niet hebt geschreven, behandelt u het bestand zoals u een niet-ondertekend script zou behandelen. 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 wordt gemachtigd om ze uit te voeren.

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

Het certificaat exporteren:

  1. Start Certificaatbeheer.
  2. Selecteer het certificaat dat is uitgegeven door de lokale PowerShell-certificaathoofdmap.
  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 opnieuw om te bevestigen.
  7. Typ een bestandsnaam met de bestandsextensie .pfx.
  8. Klik op Voltooien.

Ga als volgt te werk om het certificaat opnieuw te 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 van sterke persoonlijke sleutels inschakelen en voer vervolgens het wachtwoord in dat u tijdens het exportproces hebt toegewezen.
  5. Selecteer het persoonlijke certificaatarchief.
  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