Hai bisogno di assicurarti che nessuno apporti modifiche ai tuoi script e li passi come originali? Se è così, allora devi imparare come firmare gli script PowerShell. La firma aggiunge l’identità del pubblicatore allo script in modo che gli utenti possano decidere se fidarsi della fonte dello script.
In questo articolo, imparerai come assicurarti che vengano eseguiti solo script fidati nel tuo ambiente imparando come firmare gli script PowerShell.
Prerequisiti
Se vuoi seguire gli esempi in questo articolo, hai bisogno di quanto segue.
- A computer running on a recent version of the Windows operating system. This article uses Windows 10 version 20H2.
- Windows PowerShell 5.1 o PowerShell 6+. Gli esempi in questo articolo utilizzeranno PowerShell v7.1.3.
- A sample PowerShell script for signing. Feel free to create a script with any name and in any folder you want. This article will use a sample script called C:\ATA\myscript.ps1 that contains the code below.
Ottenere un certificato di firma del codice
Prima di imparare come firmare uno script PowerShell, devi ottenere un certificato di firma del codice. Nel mondo Microsoft, i certificati di firma del codice sono anche conosciuti come certificati Authenticode.
A code signing certificate is one type of digital certificate whose purpose for signing files. Signing a file or code with a code signing certificate adds proof that the file came from the publisher who signed it.
Dove ottenere un certificato di firma del codice dipende da dove intendi distribuire o distribuire i tuoi script firmati. E come sempre, il costo è un grosso fattore da considerare.
- Globale / Pubblico – Avrai bisogno di un certificato il cui emittente sia un Autorità di Certificazione (CA) riconosciuta a livello globale. Esempi di tali CA sono GeoTrust e DigiCert. Questi certificati non sono gratuiti. Ad esempio, un certificato DigiCert Authenticode ti costerà $474 all’anno al momento della stesura di questo articolo.
- Interno / Intranet locale – Se disponi di un server di autorità di certificazione (CA) interno, puoi richiedere e scaricare un certificato di firma dal tuo server CA interno.
- Personale / Sviluppo – Per scopi di test personale o di sviluppo, un certificato autofirmato dovrebbe essere sufficiente. Questo tipo di certificato di firma è quello che utilizzerai in questo articolo.
Creazione di un certificato autofirmato per la firma del codice
Hai letto nella sezione precedente che per imparare come firmare uno script PowerShell, hai prima bisogno di un certificato di firma del codice. Poiché farai solo test personali in questo tutorial, un certificato autofirmato sarà sufficiente. Ma dove lo ottieni?
Come suggerisce il nome, autofirmato significa che il tuo computer locale emetterà un certificato di firma del codice a se stesso. Per generare un certificato autofirmato, segui questi passaggi.
1. Apri PowerShell come amministratore sul tuo computer.
2. Copia il comando di seguito e eseguilo in PowerShell. Questo comando utilizza il cmdlet New-SelfSignedCertificate
per creare un nuovo certificato di firma del codice. Il nome del certificato è ATA Authenticode all’interno dello store dei certificati personali del computer locale.
Il cmdlet
New-SelfSignedCertificate
supporta solo la creazione di certificati nello store dei certificati personali dell’utente corrente (cert:\CurrentUser\My) o nello store dei certificati personali del computer locale (cert:\LocalMachine\My). I certificati in cert:\LocalMachine\My sono disponibili in tutto il computer.
Il comando memorizza anche l’oggetto del certificato nella variabile $authenticode
per l’uso nel passaggio successivo.
3. Successivamente, per far sì che il tuo computer si fidi del nuovo certificato che hai creato, aggiungi il certificato autofirmato allo store dei certificati Trusted Root Certification Authority e Trusted Publishers del computer. Per farlo, copia il codice di seguito ed eseguilo in PowerShell.
Ci sono tre motivi principali per installare i certificati autofirmati in tre store di certificati diversi.
- Il certificato creato nello store Personale è quello che userai come certificato di firma del codice.
- Copiando lo stesso certificato nello store Pubblicanti Affidabili assicuri che il tuo computer locale affidi al publisher che ha firmato lo script. PowerShell controlla la presenza del certificato in questo store per convalidare la firma di uno script.
- Infine, aggiungere il certificato autofirmato all’Autorità di certificazione radice attendibili assicura che il tuo computer locale abbia fiducia nei certificati presenti negli store Personale e Editore attendibile.
4. Per confermare che il certificato con il soggetto ATA Authenticode sia presente negli store Personale, Radice e Editore attendibile dei certificati, eseguire i comandi seguenti in PowerShell.

5. Per visualizzare il certificato in una GUI, aprire il Certificates Snap-in e cercare il certificato creato nella cartella Certificates all’interno degli store Personale, Autorità di certificazione radice attendibili, e Editore attendibile dei certificati.

Come firmare gli script di PowerShell
Ora che hai creato e installato il tuo certificato di firma del codice nei tre store dei certificati, sei pronto a utilizzarlo per firmare il tuo esempio di script di PowerShell. Quando hai bisogno di firmare gli script, il cmdlet principale è Set-AuthenticodeSignature
.
Per firmare lo script di PowerShell, esegui il codice di seguito in PowerShell. Il primo comando ottiene il certificato di firma del codice dallo store dei certificati personali del computer locale. Il secondo comando aggiunge una firma digitale al file dello script di PowerShell.
La maggior parte dei fornitori di certificati affidabili ha un server di timestamp e puoi trovarli sui siti web dei fornitori. Ad esempio, il server di timestamp di DigiCert è http://timestamp.digicert.com e Comodo ha http://timestamp.comodoca.com.
Dopo aver firmato lo script, dovresti visualizzare un output simile alla schermata di seguito.

Verifica della firma digitale di uno script PowerShell
Fino ad ora, hai firmato uno script PowerShell utilizzando il certificato auto-firmato che hai creato. Ma come puoi sapere se lo script ha effettivamente una firma digitale?
Apertura del codice
Un modo per confermare la firma digitale di uno script è quello di aprire lo script e visualizzare il codice in un editor di testo. Come nell’esempio seguente, lo script firmato ha un blocco di firma alla fine del codice. Il blocco di firma inizia con # SIG # Begin signature block
e termina con # SIG # End signature block
.

L’eliminazione del blocco di firma digitale dal codice dello script riporterà lo script allo stato di non firmato.
Apertura delle proprietà del file dello script
Un altro modo per verificare la firma digitale dello script è quello di aprire le proprietà del file dello script in Esplora risorse di Windows. Per farlo:
- In Esplora risorse di Windows, vai alla posizione dello script di PowerShell. In questo esempio, lo script si trova in C:\ATA\myscript.ps1.
- Fai clic con il tasto destro dello script e fai clic su Proprietà.
- Nella finestra delle proprietà del file, fai clic sulla scheda Firme digitali, e dovresti vedere una firma digitale nell’elenco Firme.

Utilizzando Get-AuthenticodeSignature
Saresti sorpreso se ti dicessi che puoi anche verificare la firma di uno script all’interno di PowerShell? Probabilmente no. Il cmdlet che puoi invocare per recuperare la firma di un file è Get-AuthenticodeSignature
.
Per ottenere la firma digitale dello script, esegui il comando seguente. Questo comando ottiene la firma del file C:\ATA\myscript.ps1. Il cmdlet Select-Object -Property *
visualizza tutti i dettagli della firma.
Dopo aver eseguito il comando, dovresti vedere un risultato simile allo screenshot sottostante. Come puoi vedere, la proprietà SignerCertificate
mostra i dettagli del certificato di firma. Mentre la proprietà TimerStamperCertificate
mostra il certificato del server di timestamp.

Esecuzione di uno script di PowerShell firmato
A questo punto, hai firmato uno script di PowerShell e confermato la presenza della firma digitale. Ma, il test definitivo per verificare se hai eseguito correttamente tutti i passaggi è eseguire lo script e confermare che viene eseguito.
PowerShell ha una funzione di sicurezza che protegge gli utenti dall’esecuzione accidentale degli script. Questa funzione di sicurezza si chiama Execution Policies. A seconda della policy di esecuzione, PowerShell può impedire o consentire l’esecuzione degli script.
Per conoscere le diverse policy di esecuzione e come influiscono sull’esecuzione degli script, consulta PowerShell Execution Policies: Understanding and Managing.
Per eseguire uno script PowerShell firmato, segui questi passaggi.
Innanzitutto, cambia la policy di esecuzione in AllSigned per garantire che solo gli script firmati possano essere eseguiti. Senza fare questo passaggio, non puoi testare accuratamente se il tuo script firmato funziona. Per farlo, invoca il cmdlet Set-ExecutionPolicy
eseguendo il comando seguente in PowerShell come amministratore.
Successivamente, esegui lo script PowerShell firmato.
Lo script dovrebbe essere eseguito senza errori o avvisi, come puoi vedere nel risultato qui sotto.

Ma se per qualche motivo lo script non è stato correttamente firmato o non è stato firmato affatto, riceverai un errore simile all’immagine qui sotto. In tal caso, ripeti i passaggi e prova a firmare di nuovo lo script.

E se alla fine aggiornassi lo script? La firma digitale sarebbe ancora valida? La risposta è no. Qualsiasi modifica allo script firmato invalida la firma digitale dello script. L’esecuzione dello script modificato non avrà successo e genererà un errore.
Segui questi passaggi per testare uno script firmato modificato.
1. Apri lo script firmato myscript.ps1 in un editor di codice o di testo.
2. Modifica il codice aggiungendo un carattere, come ad esempio un underscore in questo esempio. Non modificare nulla altro.

3. Salva lo script dopo aver modificato il codice.
4. Infine, esegui lo script modificato in PowerShell eseguendo il comando sottostante.
Dato che hai modificato lo script firmato, l’esecuzione dello script genererà l’errore mostrato di seguito. Dovrai firmare nuovamente lo script per aggiornare e correggere la sua firma digitale.

A digital signature does not guarantee that nobody modified the script from its original version. Any PowerShell script with malicious code may be digitally signed, too. Always practice caution when running scripts from sources you do not fully trust.
Conclusione
In questo articolo hai appreso perché la firma degli script PowerShell può essere necessaria a seconda delle policy di esecuzione. Hai anche imparato come distinguere tra uno script firmato e uno non firmato. Infine, hai imparato come firmare digitalmente gli script PowerShell e come testarli ed eseguirli.
Ora che sai come firmare gli script di PowerShell, inizierai a firmare gli script prima di distribuirli o implementarli?
Source:
https://adamtheautomator.com/how-to-sign-powershell-script/