about_Signing
Korte beschrijving
Hierin wordt uitgelegd hoe u scripts ondertekent zodat ze voldoen aan het PowerShell-uitvoeringsbeleid.
Lange beschrijving
Deze informatie is alleen van toepassing op PowerShell die wordt uitgevoerd in Windows.
Het beleid voor beperkte uitvoering 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 kunt ondertekenen voor uw eigen gebruik.
PowerShell controleert de Authenticode-handtekening van de volgende typen typen:
.ps1
scriptbestanden.psm1
modulebestanden.psd1
modulemanifest en gegevensbestanden.ps1xml
XML-bestanden typen en opmaken.cdxml
CDXML-scriptbestanden.xaml
XAML-scriptbestanden
Zie about_Execution_Policies voor meer informatie over PowerShell-uitvoeringsbeleid.
Ondertekende scripts uitvoeren
Wanneer u PowerShell voor het eerst start op een computer, is het beleid voor beperkte uitvoering, wat de standaardinstelling is, waarschijnlijk van kracht.
Het beperkte beleid 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 Uitvoeren als administrator 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, worden in PowerShell geen niet-ondertekende scripts uitgevoerd die zijn gedownload van internet, 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 uitvoert, 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 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 Deblokkeren.
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 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 niet meer 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 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 programmacode. Twee typen certificaten zijn geschikt voor het ondertekenen van een scriptbestand:
Certificaten die zijn gemaakt door een certificeringsinstantie: Voor een vergoeding verifieert een openbare certificeringsinstantie uw identiteit en krijgt 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 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 waarmee het certificaat wordt gemaakt. Dit certificaat is gratis en stelt u in staat om 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 schrijft voor uw eigen gebruik en om scripts te ondertekenen die u krijgt van andere bronnen die u hebt geverifieerd om veilig te zijn. Het is niet geschikt voor scripts die worden gedeeld, zelfs binnen een onderneming.
Als u een zelfondertekend certificaat maakt, moet u de beveiliging van sterke persoonlijke sleutels voor uw certificaat inschakelen. Hiermee voorkomt u dat schadelijke programma's scripts namens u ondertekenen. De instructies worden 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 wordt 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 (versie 1.1 en hoger) en in de Microsoft Windows SDK.
Zie het 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 kopiëren of typen zoals 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.
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 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 AllSigned-uitvoeringsbeleid gebruikt, kunt u met een script het script uitvoeren op uw computer.
Het volgende voorbeeldscript, Add-Signature.ps1
ondertekent een script. Als u echter het allsigned-uitvoeringsbeleid 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 noemt u deze 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
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 in PowerShell dit bericht wordt weergegeven 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.
Krachtige beveiliging voor uw persoonlijke sleutel inschakelen
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 Certificate Manager Certmgr.exe
om uw handtekeningsleutel en certificaat naar een .pfx
bestand te exporteren.
Certificaatbeheer is opgenomen in de Microsoft .NET SDK, de Microsoft Windows SDK en in Internet Explorer.
Het certificaat exporteren:
- Start Certificate Manager.
- Selecteer het certificaat dat is uitgegeven door de lokale powerShell-certificaathoofdmap.
- Klik op Exporteren om de wizard Certificaat exporteren te starten.
- Selecteer Ja, exporteer de persoonlijke sleutel en klik op Volgende.
- Selecteer Sterke beveiliging inschakelen.
- Typ een wachtwoord en typ het opnieuw om te bevestigen.
- Typ een bestandsnaam met de
.pfx
bestandsnaamextensie. - Klik op Voltooien.
Het certificaat opnieuw importeren:
- Start Certificate Manager.
- Klik op Importeren om de wizard Certificaat importeren te starten.
- Open de locatie van het
.pfx
bestand dat u tijdens het exportproces hebt gemaakt. - Selecteer op de pagina Wachtwoord de optie Sterke persoonlijke sleutelbeveiliging 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 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 vele jaren kunnen gebruiken.