Het beheren van PowerShell-scripts en hun handtekeningen kan soms een behoorlijke uitdaging zijn, vooral als je ervoor wilt zorgen dat je scripts veilig en betrouwbaar zijn. Als je ooit fouten hebt ondervonden met betrekking tot handtekeningen of vertrouwen, komt dat doordat Windows nogal kieskeurig is over het uitvoeren van scripts die niet correct zijn ondertekend of afkomstig zijn van onbetrouwbare bronnen. Eerlijk gezegd lijkt ondertekenen in sommige configuraties heel eenvoudig: je verkrijgt het certificaat, ondertekent het script en klaar. Maar soms gooit Windows obstakels op, zoals vertrouwensfouten of beleidsbeperkingen. Dat is vervelend, maar als je eenmaal de eerste hindernissen hebt overwonnen, valt het mee. Deze handleiding beschrijft hoe je PowerShell-scripts correct ondertekent, hoe je certificaten beheert en wat je moet doen als Windows niet meewerkt. Aan het einde van deze handleiding kun je je hardwarecontrolescripts (of wat je ook nodig hebt) uitvoeren zonder die “niet vertrouwd”-fouten te krijgen, ervan uitgaande dat je certificaten correct zijn ingesteld. Want Windows moet het natuurlijk onnodig ingewikkeld maken.
Hoe u PowerShell-scripts kunt ondertekenen met een codeondertekeningscertificaat
Methode 1: Gebruikmaken van een aangeschaft of intern codeondertekeningscertificaat
Dit is zinvol als u een certificaat hebt van een externe CA of het interne PKI-systeem van uw bedrijf. Deze certificaten worden standaard vertrouwd, dus het ondertekenen van uw scripts ermee zorgt meestal voor minder problemen met Windows. Ze helpen ervoor te zorgen dat scripts niet zijn gemanipuleerd, vooral in bedrijfs- of domeinomgevingen. Wanneer u een script ondertekent, herkent Windows de handtekening als afkomstig van een vertrouwde bron – en daarom is ondertekenen zo cruciaal voor die beveiligde scripts.
Voordat u kunt ondertekenen, moet u uw certificaat importeren in de lokale certificatenopslag. Open hiervoor PowerShell als beheerder en voer de volgende opdracht uit:
$pfxPassword = ConvertTo-SecureString "YourPFXPassword" -AsPlainText -Force Import-PfxCertificate -FilePath "C:\Path\To\YourCert.pfx" -CertStoreLocation cert:\LocalMachine\My -Password $pfxPassword
Hiermee wordt het certificaat geïmporteerd in het Windows-certificaatarchief, zodat het kan worden ondertekend. Sommige gebruikers merken dat dit proces soms wat onvoorspelbaar is: soms werkt het meteen, soms niet. Opnieuw opstarten helpt soms, of opnieuw importeren als het certificaat niet verschijnt.
Methode 2: Een zelfondertekend certificaat aanmaken voor testdoeleinden of intern gebruik.
Als je alleen aan het testen bent of geen certificaat wilt kopen, kun je snel een zelfondertekend codeondertekeningscertificaat genereren. Gebruik hiervoor de PowerShell -opdracht `New-SelfSignedCertificate`. Het is een beetje magisch, maar dit is het algemene idee:
$cert = New-SelfSignedCertificate -Subject "CN=MyCodeSigningCert" -Type CodeSigningCert -DnsName $env:COMPUTERNAME -CertStoreLocation "cert:\LocalMachine\My"
Hiermee wordt een certificaat aangemaakt waarmee je scripts kunt ondertekenen, maar let op: het wordt niet standaard vertrouwd op andere machines. Je moet het certificaat handmatig toevoegen aan de vertrouwde rootcertificaten op elke machine waarop je de ondertekende scripts wilt uitvoeren. Dit is omslachtig, maar soms noodzakelijk in geïsoleerde netwerken of testomgevingen.
Onderteken uw script
Zodra uw certificaat in de winkel ligt, kunt u het vinden aan de hand van de vingerafdruk en uw recept ondertekenen:
$cert = Get-ChildItem cert:\LocalMachine\My | ? Thumbprint -eq "PUT_THUMBPRINT_HERE" $scriptPath = "C:\Path\To\YourScript.ps1" Set-AuthenticodeSignature -FilePath $scriptPath -Certificate $cert -TimestampServer "http://timestamp.verisign.com/scripts/timstamp.dll"
Met dit commando wordt een handtekening onderaan je scriptbestand geplaatst. Je ziet een handtekeningblok dat eruitziet als een hoop gecodeerde gegevens – misschien een beetje eng, maar het is allemaal in orde. Als alles in orde is, staat er ‘Geldig’.Anders krijg je foutmeldingen zoals ‘certificaat niet geschikt’ of ‘niet-vertrouwde root’.
Tip: soms mislukt het ondertekenen omdat de certificaatketen niet volledig wordt vertrouwd, vooral bij zelfondertekende certificaten. Zorg ervoor dat u het root-CA-certificaat in uw vertrouwde rootcertificaatarchief en het uitgevende CA-certificaat in uw vertrouwde uitgeversarchief hebt geïmporteerd. U kunt dit doen door certlm.mscde certificaten naar de juiste archieflocaties te slepen. Het is vrij eenvoudig, maar vereist beheerdersrechten.
PowerShell je handtekeningen laten accepteren en scripts laten uitvoeren
Pas het uitvoeringsbeleid aan.
Standaard blokkeert PowerShell scripts volledig (Beperkt).Om uw ondertekende scripts uit te voeren, moet u dit een beetje versoepelen. Stel het uitvoeringsbeleid in op Alles ondertekend — dit betekent dat alleen ondertekende scripts worden uitgevoerd. Voer dit commando uit:
Set-ExecutionPolicy AllSigned -Force
Hierdoor wordt PowerShell gedwongen alleen scripts met een geldige handtekening uit te voeren, wat erg goed is voor de beveiliging. Om te controleren wat er nu is ingesteld, voert u het volgende commando uit:
Get-ExecutionPolicy
Als je ‘Restricted’ of ‘RemoteSigned’ ziet staan en je wilt het uitvoeren van ondertekende scripts toestaan, kan het wijzigen hiervan helpen. Houd er wel rekening mee dat je in sommige gevallen (bijvoorbeeld in bedrijfsgroepen) beheerdersrechten of wijzigingen in het groepsbeleid nodig hebt.
Vertrouw op je certificaten.
Als u fouten tegenkomt met betrekking tot niet-vertrouwde certificaten, zoals ‘certificaatketen verwerkt maar beëindigd in een rootcertificaat dat niet wordt vertrouwd’, moet u mogelijk uw ondertekeningscertificaat toevoegen aan de vertrouwde rootcertificeringsinstanties. Dit is een ietwat gemakkelijke, maar noodzakelijke oplossing, vooral als u een zelfondertekend certificaat gebruikt. En ja, dit betekent dat u uw certificaat moet importeren in de vertrouwde rootcertificeringsinstanties voor de lokale machine of gebruikersopslag met behulp van de opdracht `import` certlm.msc.
Als u dit centraal wilt doen, kunt u certificaten het beste via Groepsbeleid implementeren. Voeg hiervoor het root-CA-certificaat toe aan de “Vertrouwde basiscertificeringsinstanties” in het Groepsbeleid.
Uw scripthandtekening verifiëren
Om te controleren of uw script correct is ondertekend en vertrouwd, voert u het volgende commando uit:
Get-AuthenticodeSignature -FilePath "C:\Path\To\YourScript.ps1"
Bij “Status” moet “Geldig” staan. Als er iets anders staat, zoals “HashMismatch”, betekent dit dat het script na het ondertekenen is gewijzigd of dat de handtekening niet meer geldig is. In dat geval moet u het script opnieuw ondertekenen.
Belangrijke opmerking: zelfs als uw script is ondertekend, kan Windows het nog steeds blokkeren als de root-CA niet wordt vertrouwd of de certificaatketen niet compleet is. Daarom is het in bedrijfsomgevingen vaak nodig om uw certificaten handmatig of via GPO te vertrouwen.
Het uitvoeren van uw ondertekende script
Zodra alles is ingesteld, zou u uw script zonder fouten met betrekking tot de handtekening moeten kunnen uitvoeren. Dubbelklik er gewoon op of voer het uit vanuit PowerShell met >.\HardwareReadiness.ps1. Houd er rekening mee dat als u een strenger uitvoeringsbeleid hebt (zoals AllSigned of Unrestricted), dit moet overeenkomen met uw beleidsinstellingen om scripts probleemloos te laten werken.
- Zorg ervoor dat uw certificaat geldig en betrouwbaar is.
- Stel de uitvoeringsbeleidsregels op de juiste manier in.
- Importeer uw certificaten opnieuw of vertrouw ze als de handtekeningen nog steeds niet worden geaccepteerd.
- Scripts opnieuw ondertekenen als de code na ondertekening verandert.
Samenvatting
- Importeer uw codeondertekeningscertificaat — afkomstig van een certificeringsinstantie of zelfondertekend.
- Gebruik PowerShell om scripts te ondertekenen met
Set-AuthenticodeSignature - Pas het uitvoeringsbeleid aan om ondertekende scripts toe te staan.
- Vertrouw op uw certificaatketen door de benodigde certificaten in vertrouwde certificatenopslagplaatsen te importeren.
- Verifieer handtekeningen met
Get-AuthenticodeSignature
Samenvatting
Het ondertekenen en vertrouwen van scripts is niet altijd zo eenvoudig als het zou moeten zijn, maar zodra je de certificaten hebt en begrijpt hoe Windows de ondertekening controleert, gaat het een stuk soepeler. Dit is vooral handig voor automatiseringsscripts of bedrijfsomgevingen waar beveiliging belangrijk is. Ik weet niet precies waarom, maar soms helpt het om PowerShell of zelfs de hele computer opnieuw op te starten als certificaten niet meteen worden herkend. Houd de geldigheid van je certificaten en de vertrouwensketen in de gaten, en dan zou het goed moeten komen. Hopelijk bespaart dit iemand een paar uur.