Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Breve descrizione
Illustra come firmare gli script in modo che siano conformi ai criteri di esecuzione di PowerShell.
Descrizione lunga
Queste informazioni si applicano solo a PowerShell in esecuzione in Windows.
I criteri di esecuzione con restrizioni non consentono l'esecuzione di script. I criteri di esecuzione AllSigned e RemoteSigned impediscono a PowerShell di eseguire script che non dispongono di una firma digitale.
Questo argomento illustra come eseguire script selezionati che non sono firmati, anche se i criteri di esecuzione sono RemoteSignede come firmare gli script per un uso personalizzato.
PowerShell controlla la firma Authenticode dei tipi seguenti:
-
.ps1file di script -
.psm1file dei moduli -
.psd1manifesto del modulo e file di dati -
.ps1xmltipo e formattare i file XML -
.cdxmlfile di script CDXML -
.xamlfile di script XAML
Per altre informazioni sui criteri di esecuzione di PowerShell, vedere about_Execution_Policies.
Consentire l'esecuzione di script firmati
Quando si avvia PowerShell in un computer per la prima volta, è probabile che il criterio di esecuzione con restrizioni, ovvero quello predefinito, sia attivo.
Il criterio di con restrizioni impedisce l'esecuzione di tutti gli script.
Per trovare i criteri di esecuzione effettivi nel computer, digitare:
Get-ExecutionPolicy
Il criterio RemoteSigned consente di eseguire script firmati o script non firmati creati in locale. Per configurare questo criterio, avviare PowerShell con l'opzione Esegui come amministratore e quindi usare il comando seguente per modificare i criteri di esecuzione.
Set-ExecutionPolicy RemoteSigned
Per altre informazioni, vedere l'argomento di aiuto per il cmdlet Set-ExecutionPolicy.
Per eseguire uno script firmato, lo script deve avere una firma digitale da un autore attendibile. Il certificato di firma del codice deve essere emesso da un'autorità di certificazione considerata attendibile sul computer. I certificati autofirmati devono essere installati nel computer nell'archivio Certificati Radice Attendibili.
Eseguire script non firmati usando il criterio RemoteSigned
Se i criteri di esecuzione di PowerShell sono RemoteSigned, PowerShell non eseguirà script non firmati scaricati da Internet, inclusi gli script non firmati ricevuti tramite posta elettronica e programmi di messaggistica istantanea.
Se si tenta di eseguire uno script scaricato, PowerShell visualizza il messaggio di errore seguente:
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.
Prima di eseguire lo script, esaminare il codice per assicurarsi di considerarlo attendibile. Gli script hanno lo stesso effetto di qualsiasi programma eseguibile.
Per eseguire uno script non firmato, usare il cmdlet Unblock-File o usare la procedura seguente.
- Salvare il file di script nel computer.
- Fare clic su Start, fare clic su Computere individuare il file di script salvato.
- Fare clic con il pulsante destro del mouse sul file di script e quindi scegliere proprietà .
- Clicca su Sblocca.
Se uno script scaricato da Internet è firmato digitalmente, ma non si è ancora scelto di considerare attendibile il server di pubblicazione, PowerShell visualizza il messaggio seguente:
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"):
Se si considera attendibile l'editore, selezionare Esegui una volta o Esegui sempre. Se non ti fidi dell'editore, selezionare Mai eseguire o Non eseguire. Se selezioni Non eseguire mai o Esegui sempre, PowerShell non ti chiederà di nuovo per questo editore.
Metodi di firma degli script
Puoi firmare gli script che scrivi e quelli che ottieni da altre origini. Prima di firmare qualsiasi script, esaminare ogni comando per verificare che sia sicuro da eseguire.
Per altre informazioni su come firmare un file di script, vedere Set-AuthenticodeSignature.
Il cmdlet New-SelfSignedCertificate, introdotto nel modulo PKI in PowerShell 3.0, crea un certificato autofirmato appropriato per il test. Per altre informazioni, vedere l'argomento di aiuto per il cmdlet New-SelfSignedCertificate.
Per aggiungere una firma digitale a uno script, è necessario firmarla con un certificato di firma del codice. Due tipi di certificati sono adatti per la firma di un file di script:
Certificati creati da un'autorità di certificazione: per una tariffa, un'autorità di certificazione pubblica verifica l'identità e fornisce un certificato di firma del codice. Quando si acquista il certificato da un'autorità di certificazione affidabile, è possibile condividere lo script con gli utenti in altri computer che eseguono Windows perché tali computer considerano attendibile l'autorità di certificazione.
Certificati creati: è possibile creare un certificato autofirmato per il quale il computer è l'autorità che crea il certificato. Questo certificato è gratuito e consente di scrivere, firmare ed eseguire script nel computer. Tuttavia, uno script firmato da un certificato autofirmato non verrà eseguito in altri computer.
Il certificato autofirmato deve essere usato solo per firmare gli script a scopo di test. I certificati autofirmati non sono appropriati per gli script che si desidera condividere.
Se si crea un certificato autofirmato, assicurarsi di abilitare la protezione con chiave privata avanzata nel certificato. Ciò impedisce ai programmi dannosi di firmare script per conto dell'utente. Le istruzioni sono incluse alla fine di questo argomento.
Creare un certificato autofirmato
Per creare un certificato autofirmato, usare il cmdlet New-SelfSignedCertificate nel modulo PKI. Questo modulo è stato introdotto in PowerShell 3.0. Per altre informazioni, vedere l'argomento di aiuto per il cmdlet New-SelfSignedCertificate.
$params = @{
Subject = 'CN=PowerShell Code Signing Cert'
Type = 'CodeSigning'
CertStoreLocation = 'Cert:\CurrentUser\My'
HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params
Uso di Makecert.exe
Per creare un certificato autofirmato nelle versioni precedenti di Windows, usare lo strumento Creazione certificati MakeCert.exe. Questo strumento è incluso in Microsoft .NET SDK (versioni 1.1 e successive) e in Microsoft Windows SDK.
Per altre informazioni sulla sintassi e sulle descrizioni dei parametri dello strumento MakeCert.exe, vedere Certificate Creation Tool (MakeCert.exe).
Per usare lo strumento MakeCert.exe per creare un certificato, eseguire i comandi seguenti in una finestra del prompt dei comandi dell'SDK.
Nota
Il primo comando crea un'autorità di certificazione locale per il computer. Il secondo comando genera un certificato personale dall'autorità di certificazione. È possibile copiare o digitare i comandi esattamente come vengono visualizzati. Non sono necessarie sostituzioni, anche se è possibile modificare il nome del certificato.
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
Lo strumento MakeCert.exe richiede una password di chiave privata. La password garantisce che nessuno possa usare o accedere al certificato senza il consenso dell'utente.
Creare e immettere una password che è possibile ricordare. Questa password verrà usata in un secondo momento per recuperare il certificato.
Per verificare che il certificato sia stato generato correttamente, usare il comando seguente per ottenere il certificato nell'archivio certificati nel computer. Non è possibile trovare un file di certificato nella directory del file system.
Al prompt di PowerShell digitare:
Get-ChildItem Cert:\CurrentUser\my -CodeSigning
Questo comando usa il provider di certificati PowerShell per visualizzare informazioni sul certificato.
Se il certificato è stato creato, l'output mostra l'impronta digitale che consente di identificare il certificato in un display simile al seguente:
Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My
Thumbprint Subject
---------- -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF CN=PowerShell User
Firmare uno script
Dopo aver creato un certificato autofirmato, è possibile firmare gli script. Se si usa il criterio di esecuzione AllSigned, la firma di uno script consente di eseguire lo script nel computer.
Lo script di esempio seguente, Add-Signature.ps1, firma uno script. Tuttavia, se si usa il criterio di esecuzione AllSigned, è necessario firmare lo script Add-Signature.ps1 prima di eseguirlo.
Importante
Prima di PowerShell 7.2, lo script deve essere salvato usando la codifica ASCII o UTF8NoBOM. PowerShell 7.2 e versioni successive supporta script firmati per qualsiasi formato di codifica.
Per usare questo script, copiare il testo seguente in un file di testo e denominarlo 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
Per firmare il file di script Add-Signature.ps1, digitare i comandi seguenti al prompt dei comandi di PowerShell:
$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
Select-Object -First 1
Set-AuthenticodeSignature Add-Signature.ps1 $cert
Il cmdlet Set-AuthenticodeSignature aggiunge la firma al file di script come blocco di commenti alla fine del file. Il blocco di commenti inizia e termina con # SIG #.
Dopo aver firmato lo script, è possibile eseguirlo nel computer locale. Tuttavia, lo script non verrà eseguito nei computer in cui i criteri di esecuzione di PowerShell richiedono una firma digitale da un'autorità attendibile. Se si prova, PowerShell visualizza il messaggio di errore seguente:
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 <<<<
Se PowerShell visualizza questo messaggio quando si esegue uno script che non è stato scritto, considerare il file come si considererebbe qualsiasi script non firmato. Esaminare il codice per determinare se è possibile considerare attendibile lo script.
Abilitare la protezione avanzata per la chiave privata
Se si dispone di una chiave privata e di un certificato nel computer, i programmi dannosi potrebbero essere in grado di firmare script per conto dell'utente, che autorizza PowerShell a eseguirli.
Per impedire la firma automatica per conto dell'utente, usare Gestione certificati Certmgr.exe per esportare la chiave di firma e il certificato in un file di .pfx.
Gestione certificati è incluso in Microsoft .NET SDK, Microsoft Windows SDK e in Internet Explorer.
Per esportare il certificato:
- Avviare Gestione certificati.
- Selezionare il certificato emesso da PowerShell Local Certificate Root.
- Fare clic su Esporta per avviare la procedura guidata per l'esportazione del certificato.
- Selezionare Sì, esportare la chiave privatae quindi fare clic su Avanti.
- Selezionare Abilita protezione avanzata.
- Digitare una password e quindi digitarla di nuovo per confermare.
- Digitare un nome file con l'estensione del nome file
.pfx. - Fare clic su Fine.
Per riimportare il certificato:
- Avviare Gestione certificati.
- Fare clic su Importa per avviare l'Importazione Guidata Certificati.
- Aprire il percorso del file
.pfxcreato durante il processo di esportazione. - Nella pagina Password selezionare Abilita protezione con chiave privata complessae quindi immettere la password assegnata durante il processo di esportazione.
- Selezionare l'archivio certificati personale.
- Fare clic su Fine.
Impedire la scadenza della firma
La firma digitale in uno script è valida fino alla scadenza del certificato di firma o fino a quando un server timestamp può verificare che lo script sia stato firmato mentre il certificato di firma è valido.
Poiché la maggior parte dei certificati di firma è valida solo per un anno, l'uso di un server timestamp garantisce che gli utenti possano usare lo script per molti anni.