Self-signing your Windows Powershell scripts allows you to run your scripts without fully disabling security. Disabling security would permit malicious scripts to run.
| This example uses Windows 10, so change your targets as appropriate. |
Install the Windows SDK
Download the Windows 10 SDK from https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk
Install the SDK by running the downloaded executable.
Make makecert available
Find
In my version of Windows, make cert is found under the folder, C:\Program Files (x86)\Windows Kits\10\bin. Explore to find the exact location of makecert.
Copy
I choose to copy the makecert to my C:\bin folder (already in my PATH) but you may choose to add the folder to your path instead.
-
In Powershell,
copy "C:\Program Files (x86)\Windows Kits\10\bin\x64\makecert.exe" C:\bin
Add to PATH
Alternatively, you may add the folder to your path.
-
Windows key - r -
Enter SystemPropertiesAdvanced
-
Click Environment Variables
-
Select PATH
-
Click Edit
-
Add C:\Program Files (x86)\Windows Kits\10\bin\x64 as a new variable in your path
Using makecert
-
Start Powershell as an Administrator
Local Certificate Authority
-
makecert -n "CN=PowerShell Local Certificate Root" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer -ss Root -sr localMachine-
Enter passwords
-
Operation should succeed
-
-
Verify via
CertMgr-
Navigate to Trusted Root Certificate Authorities >> Certificates
-
Find the certificate named, PowerShell Local Certificate Root
-
Generate a Personal Certificate
-
makecert -pe -n "CN=Gary PowerShell Cert" -ss MY -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer-
Enter password
-
Operation should succeed
-
-
Verify via
CertMgr-
Navigate to Personal >> Certificates
-
Find the certificate named, Gary PowerShell Cert
-
-
Verify your certificate is available,
get-childitem cert:\CurrentUser\my -codesigning-
You should see your certificate listed
-
The certificate is now ready for use on the current system. See http://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html for information on how to export it to other systems.
Change Powershell Execution Policy
-
Show current execution policy,
Get-ExecutionPolicy -List -
Change execution policy to AllSigned with a CurrentUSer scope,
Set-ExecutionPolicy AllSigned -Scope CurrentUser
Sign some code
Have your freshly written script ready for signing. For demonstration, the script is named example.ps1.
-
Start Powershell as a user
-
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0] -
$file = "\bin\screenshot.ps1" -
Set-AuthenticodeSignature $file $cert
The reply you receive should be similar to:
Directory: C:\path SignerCertificate Status Path ----------------- ------ ---- 34552NJNH568NJBH3256I Valid example.ps1
Downloaded Scripts
Downloaded scripts cannot be signed due to special metadata attached to the file. This may be viewed by opening a cmd window and entering the command dir /r or dir /r filename. You will notice that some files may have a second entry similar to the following:
08/27/2015 12:51 PM 372,681 filename
26 filename:Zone.Identifier:$DATA
Resources
-
http://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html
-
http://woshub.com/how-to-create-self-signed-certificate-with-powershell/
-
https://msdn.microsoft.com/en-us/library/aa388165(v=vs.85).aspx
-
http://woshub.com/how-windows-determines-that-the-file-has-been-downloaded-from-the-internet/
-
https://technet.microsoft.com/en-us/sysinternals/bb545027.aspx
-
https://4sysops.com/archives/sign-your-powershell-scripts-to-increase-security/
