In questo articolo andremo a vedere come creare un certificato personale per firmare digitalmente uno script PowerShell per permettere la sua esecuzione in ambienti particolarmente restrittivi. L’esecuzione di script PowerShell è normalmente disattivata, permettere l’esecuzione di tutti gli script può non essere la soluzione più adatta, in termini di sicurezza, magari possiamo scegliere un approccio più morbido per eseguire script firmati da noi.

Non ho modo di sapere se questa soluzione possa funzionare in tutti gli ambienti, dove ci sono policy aziendali molto restrittive o antivirus particolarmente “paranoici”, non vi resta che provare.

Creazione del certificato

Per creare un certificato bisogna usare questo comando:

  • New-SelfSignedCertificate -DnsName turbolab@turbolab.it -CertStoreLocation Cert:\CurrentUser\My\ -FriendlyName "MyCert" -NotAfter (Get-Date).AddYears(10) -KeyLength 4096 -Type Codesigning

Come creare certificato firmare digitalmente script PowerShell

Per vedere se è effettivamente presente tra i certificati personali si utilizza questo comando:

  • Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert

Come creare certificato firmare digitalmente script PowerShell

Il dato che ci serve, per esportare il certificato e creare un file .cer, è il Thumbprint da inserire in questo comando:

  • Export-Certificate -Cert Cert:\CurrentUser\My\Inserire_Il_Thumbprint -FilePath d:\certificato.cer

Nome del file e destinazione dove salvarlo li potete modificare a vostra scelta.

Come creare certificato firmare digitalmente script PowerShell

Bisogna ora importare il certificato come Autorità di certificazione attendibile e poi come Autore attendibile.

  • Import-Certificate -CertStoreLocation Cert:\LocalMachine\TrustedPublisher -FilePath d:\certificato.cer
  • Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath d:\certificato.cer

Come creare certificato firmare digitalmente script PowerShell

Quando ho provato a importare il certificato in un computer diverso da quello dove l’avevo creato, inizialmente avevo il file del certificato su una pendrive e ottenevo un errore di accesso negato quando tentavo l’importazione con i comandi appena visti. L’errore è stato superato quando ho copiato il file del certificato sul disco locale ed allora sono riuscito ad importare il file.

Una volta installato il certificato cambieranno anche le sue informazioni.

Come creare certificato firmare digitalmente script PowerShell

Ora possiamo firmare digitalmente il nostro script PowerShell:

  • Set-AuthenticodeSignature -FilePath d:\turbolab.ps1 -Certificate (Get-ChildItem -Path Cert:\CurrentUser\My\ Inserire_Il_Thumbprint)

Come creare certificato firmare digitalmente script PowerShell

Andando a verificare le proprietà del file ci sarà ora la firma digitale.

Come creare certificato firmare digitalmente script PowerShell

I criteri di esecuzione script

Per modificare i criteri di esecuzione di PowerShell, in modo da consentire solo gli script firmati, bisogna consultare questo articolo.

Il commando Set-ExecutionPolicy AllSigned permette di eseguire solo script firmati digitalmente, mentre se eseguo lo scriptnonfirmato.ps1 questo viene bloccato.

Per eseguire uno script Powershell non firmato digitalmente dovrei usare Set-ExecutionPolicy unrestricted.

Come creare certificato firmare digitalmente script PowerShell