Condividi tramite


about_Signing

Descrizione breve

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 RemoteSigned e come firmare gli script per un uso personalizzato.

PowerShell controlla la firma Authenticode dei tipi seguenti:

  • .ps1 file script
  • .psm1 file di modulo
  • .psd1 file di dati e manifesto del modulo
  • .ps1xml file XML di tipo e formato
  • .cdxml File di script CDXML
  • .xaml File di script XAML

Per altre informazioni sui criteri di esecuzione di PowerShell, vedere about_Execution_Policies.

Per consentire l'esecuzione di script firmati

Quando si avvia PowerShell in un computer per la prima volta, è probabile che i criteri di esecuzione con restrizioni, ovvero l'impostazione predefinita, siano effettivi.

I criteri con restrizioni non consentono l'esecuzione di script.

Per trovare i criteri di esecuzione effettivi nel computer, digitare:

Get-ExecutionPolicy

Per eseguire script non firmati scritti nel computer locale e script firmati da altri utenti, avviare PowerShell con l'opzione Esegui come amministratore e quindi usare il comando seguente per modificare i criteri di esecuzione nel computer in RemoteSigned:

Set-ExecutionPolicy RemoteSigned

Per altre informazioni, vedere l'argomento della Guida per il Set-ExecutionPolicy cmdlet .

Esecuzione di script non firmati usando i criteri di esecuzione 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 Unblock-File cmdlet o usare la procedura seguente.

  1. Salvare il file di script nel computer.
  2. Fare clic su Start, fare clic su Computer personale e individuare il file di script salvato.
  3. Fare clic con il pulsante destro del mouse sul file di script e quindi scegliere Proprietà.
  4. Fare clic 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 il server di pubblicazione, selezionare Esegui una sola volta o Esegui sempre. Se il server di pubblicazione non è attendibile, selezionare Mai eseguito o Non eseguire. Se si seleziona Mai eseguire o Esegui sempre, PowerShell non richiederà di nuovo questo server di pubblicazione.

Metodi di firma degli script

È possibile firmare gli script scritti e gli script che si ottengono da altre origini. Prima di firmare qualsiasi script, esaminare ogni comando per verificare che sia sicuro da eseguire.

Per le procedure consigliate per la firma del codice, vedere Procedure consigliate per la firma del codice.

Per altre informazioni su come firmare un file di script, vedere Set-AuthenticodeSignature.

Il New-SelfSignedCertificate cmdlet, introdotto nel modulo PKI in PowerShell 3.0, crea un certificato autofirmato appropriato per il test. Per altre informazioni, vedere l'argomento della Guida per il New-SelfSignedCertificate cmdlet .

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.

In genere, si usa un certificato autofirmato solo per firmare gli script scritti per uso personalizzato e firmare script che si ottengono da altre origini verificate di essere sicure. Non è appropriato per gli script che verranno condivisi, anche all'interno di un'azienda.

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 della Guida per il New-SelfSignedCertificate cmdlet .

$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 MakeCert.exeCreazione certificati . 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, vedere Strumento di creazione certificati (MakeCert.exe).For more information about the syntax and the parameter description of the MakeCert.exe tool, see Certificate Creation Tool (MakeCert.exe).

Per usare lo MakeCert.exe strumento 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 MakeCert.exe strumento 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'identificazione personale che identifica il certificato in una visualizzazione simile alla 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 usano i criteri 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 usano i criteri di esecuzione AllSigned , è necessario firmare lo Add-Signature.ps1 script 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 Add-Signature.ps1 file di script, 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

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 Certmgr.exe certificati per esportare la chiave di firma e il certificato in un .pfx file. Gestione certificati è incluso in Microsoft .NET SDK, Microsoft Windows SDK e in Internet Explorer.

Per esportare il certificato:

  1. Avviare Gestione certificati.
  2. Selezionare il certificato rilasciato dalla radice del certificato locale di PowerShell.
  3. Fare clic su Esporta per avviare l'Esportazione guidata certificati.
  4. Selezionare Sì, esporta la chiave privata e quindi fare clic su Avanti.
  5. Selezionare Abilita protezione avanzata.
  6. Digitare una password e quindi digitarla di nuovo per confermare.
  7. Digitare un nome file con l'estensione .pfx del nome file.
  8. Fare clic su Fine.

Per riimportare il certificato:

  1. Avviare Gestione certificati.
  2. Fare clic su Importa per avviare l'Importazione guidata certificati.
  3. Aprire il percorso del .pfx file creato durante il processo di esportazione.
  4. Nella pagina Password selezionare Abilita protezione con chiave privata complessa e quindi immettere la password assegnata durante il processo di esportazione.
  5. Selezionare l'archivio certificati Personale.
  6. 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.

Vedi anche