Informazioni sulla firmaAbout Signing

Breve descrizioneShort description

Spiega come firmare gli script in modo che siano conformi ai criteri di esecuzione di PowerShell.Explains how to sign scripts so that they comply with the PowerShell execution policies.

Descrizione lungaLong description

Il criterio di esecuzione con restrizioni non consente l'esecuzione di script.The Restricted execution policy does not permit any scripts to run. I criteri di esecuzione AllSigned e RemoteSigned impediscono a PowerShell di eseguire script che non dispongono di una firma digitale.The AllSigned and RemoteSigned execution policies prevent PowerShell from running scripts that do not have a digital signature.

In questo argomento viene illustrato come eseguire script selezionati che non sono firmati, anche se i criteri di esecuzione sono RemoteSigned e come firmare gli script per uso personale.This topic explains how to run selected scripts that are not signed, even while the execution policy is RemoteSigned , and how to sign scripts for your own use.

Per ulteriori informazioni sui criteri di esecuzione di PowerShell, vedere about_Execution_Policies.For more information about PowerShell execution policies, see about_Execution_Policies.

Per consentire l'esecuzione di script firmatiTo permit signed scripts to run

Quando si avvia PowerShell in un computer per la prima volta, è probabile che il criterio di esecuzione con restrizioni (impostazione predefinita) sia attivo.When you start PowerShell on a computer for the first time, the Restricted execution policy (the default) is likely to be in effect.

Il criterio con restrizioni non consente l'esecuzione di script.The Restricted policy does not permit any scripts to run.

Per trovare i criteri di esecuzione effettivi nel computer, digitare:To find the effective execution policy on your computer, type:

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, quindi usare il comando seguente per modificare i criteri di esecuzione nel computer in RemoteSigned :To run unsigned scripts that you write on your local computer and signed scripts from other users, start PowerShell with the Run as Administrator option and then use the following command to change the execution policy on the computer to RemoteSigned :

Set-ExecutionPolicy RemoteSigned

Per ulteriori informazioni, vedere l'argomento della Guida relativo al Set-ExecutionPolicy cmdlet.For more information, see the help topic for the Set-ExecutionPolicy cmdlet.

Esecuzione di script non firmati con i criteri di esecuzione RemoteSignedRunning unsigned scripts using the RemoteSigned execution policy

Se il criterio di esecuzione di PowerShell è RemoteSigned , PowerShell non esegue gli script non firmati scaricati da Internet, inclusi gli script non firmati ricevuti tramite la posta elettronica e i programmi di messaggistica immediata.If your PowerShell execution policy is RemoteSigned , PowerShell will not run unsigned scripts that are downloaded from the internet, including unsigned scripts you receive through email and instant messaging programs.

Se si tenta di eseguire uno script scaricato, in PowerShell viene visualizzato il messaggio di errore seguente:If you try to run a downloaded script, PowerShell displays the following error message:

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.Before you run the script, review the code to be sure that you trust it. Gli script hanno lo stesso effetto di qualsiasi programma eseguibile.Scripts have the same effect as any executable program.

Per eseguire uno script non firmato, utilizzare il cmdlet Unblock-File o utilizzare la procedura riportata di seguito.To run an unsigned script, use the Unblock-File cmdlet or use the following procedure.

  1. Salvare il file di script nel computer.Save the script file on your computer.
  2. Fare clic sul pulsante Start, scegliere Computer locale e individuare il file di script salvato.Click Start, click My Computer, and locate the saved script file.
  3. Fare clic con il pulsante destro del mouse sul file di script, quindi scegliere Proprietà.Right-click the script file, and then click Properties.
  4. Fare clic su Annulla blocco.Click Unblock.

Se uno script scaricato da Internet è firmato digitalmente, ma non si è ancora scelto di considerare attendibile il relativo editore, in PowerShell viene visualizzato il messaggio seguente:If a script that was downloaded from the internet is digitally signed, but you have not yet chosen to trust its publisher, PowerShell displays the following message:

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'autore, selezionare "Esegui una volta" o "Esegui sempre".If you trust the publisher, select "Run once" or "Always run." Se non si considera attendibile l'autore, selezionare "non eseguire mai" o "non eseguire".If you do not trust the publisher, select either "Never run" or "Do not run." Se si seleziona "non eseguire mai" o "sempre eseguito", PowerShell non richiede di nuovo l'esecuzione di questo server di pubblicazione.If you select "Never run" or "Always run," PowerShell will not prompt you again for this publisher.

Metodi di firma degli scriptMethods of signing scripts

È possibile firmare gli script scritti e gli script ottenuti da altre origini.You can sign the scripts that you write and the scripts that you obtain from other sources. Prima di firmare uno script, esaminare ogni comando per verificare che sia in esecuzione sicura.Before you sign any script, examine each command to verify that it is safe to run.

Per le procedure consigliate sulla firma del codice, vedere procedure consigliateper la firma del codice.For best practices about code signing, see Code-Signing Best Practices.

Per ulteriori informazioni sulla firma di un file di script, vedere Set-AuthenticodeSignature.For more information about how to sign a script file, see Set-AuthenticodeSignature.

Il New-SelfSignedCertificate cmdlet, introdotto nel modulo PKI in PowerShell 3,0, crea un certificato autofirmato appropriato per il test.The New-SelfSignedCertificate cmdlet, introduced in the PKI module in PowerShell 3.0, creates a self-signed certificate that is Appropriate for testing. Per ulteriori informazioni, vedere l'argomento della Guida per il cmdlet New-SelfSignedCertificate.For more information, see the help topic for the New-SelfSignedCertificate cmdlet.

Per aggiungere una firma digitale a uno script, è necessario firmarlo con un certificato di firma del codice.To add a digital signature to a script, you must sign it with a code signing certificate. Due tipi di certificati sono adatti per la firma di un file script:Two types of certificates are suitable for signing a script file:

  • 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.Certificates that are created by a certification authority: For a fee, a public certification authority verifies your identity and gives you a code signing certificate. Quando si acquista il certificato da un'autorità di certificazione attendibile, è possibile condividere lo script con gli utenti di altri computer che eseguono Windows, perché gli altri computer considerano attendibile l'autorità di certificazione.When you purchase your certificate from a reputable certification authority, you are able to share your script with users on other computers that are running Windows because those other computers trust the certification authority.

  • Certificati creati: è possibile creare un certificato autofirmato per il quale il computer è l'autorità che crea il certificato.Certificates that you create: You can create a self-signed certificate for which your computer is the authority that creates the certificate. Questo certificato è gratuito e consente di scrivere, firmare ed eseguire script nel computer.This certificate is free of charge and enables you to write, sign, and run scripts on your computer. Tuttavia, uno script firmato da un certificato autofirmato non viene eseguito in altri computer.However, a script signed by a self-signed certificate will not run on other computers.

In genere, si usa un certificato autofirmato solo per firmare gli script che si scrivono per uso personale e per firmare gli script che si ottengono da altre origini verificate come sicure.Typically, you would use a self-signed certificate only to sign scripts that you write for your own use and to sign scripts that you get from other sources that you have verified to be safe. Non è appropriato per gli script che verranno condivisi, anche all'interno di un'azienda.It is not appropriate for scripts that will be shared, even within an enterprise.

Se si crea un certificato autofirmato, assicurarsi di abilitare la protezione avanzata con chiave privata nel certificato.If you create a self-signed certificate, be sure to enable strong private key protection on your certificate. Ciò impedisce ai programmi dannosi di firmare script per conto dell'utente.This prevents malicious programs from signing scripts on your behalf. Le istruzioni sono incluse alla fine di questo argomento.The instructions are included at the end of this topic.

Creare un certificato autofirmatoCreate a self-signed certificate

Per creare un certificato autofirmato in, usare il New-SelfSignedCertificate cmdlet nel modulo PKI.To create a self-signed certificate in use the New-SelfSignedCertificate cmdlet in the PKI module. Questo modulo è stato introdotto in PowerShell 3,0 ed è incluso in Windows 8 e Windows Server 2012.This module is introduced in PowerShell 3.0 and is included in Windows 8 and Windows Server 2012. Per ulteriori informazioni, vedere l'argomento della Guida relativo al New-SelfSignedCertificate cmdlet.For more information, see the help topic for the New-SelfSignedCertificate cmdlet.

Per creare un certificato autofirmato nelle versioni precedenti di Windows, usare lo strumento di creazione dei certificati MakeCert.exe .To create a self-signed certificate in earlier versions of Windows, use the Certificate Creation tool MakeCert.exe. Questo strumento è incluso in Microsoft .NET SDK (versioni 1,1 e successive) e nel Microsoft Windows SDK.This tool is included in the Microsoft .NET SDK (versions 1.1 and later) and in the Microsoft Windows SDK.

Per ulteriori informazioni sulla sintassi e sulle descrizioni dei parametri dello strumento MakeCert.exe, vedere strumento per la creazione di certificati (MakeCert.exe).For more information about the syntax and the parameter descriptions of the MakeCert.exe tool, see 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 di SDK.To use the MakeCert.exe tool to create a certificate, run the following commands in an SDK Command Prompt window.

Nota: il primo comando crea un'autorità di certificazione locale per il computer.Note: The first command creates a local certification authority for your computer. Il secondo comando genera un certificato personale dell'autorità di certificazione.The second command generates a personal certificate from the certification authority.

Nota: è possibile copiare o digitare i comandi esattamente come appaiono.Note: You can copy or type the commands exactly as they appear. Non sono necessarie sostituzioni, anche se è possibile modificare il nome del certificato.No substitutions are necessary, although you can change the certificate name.

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

makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 `
-eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

Lo strumento MakeCert.exe richiederà una password della chiave privata.The MakeCert.exe tool will prompt you for a private key password. La password garantisce che nessuno possa usare o accedere al certificato senza il consenso dell'utente.The password ensures that no one can use or access the certificate without your consent. Creare e immettere una password che è possibile ricordare.Create and enter a password that you can remember. Questa password verrà utilizzata in un secondo momento per recuperare il certificato.You will use this password later to retrieve the certificate.

Per verificare che il certificato sia stato generato correttamente, usare il comando seguente per ottenere il certificato nell'archivio certificati del computer.To verify that the certificate was generated correctly, use the following command to get the certificate in the certificate store on the computer. Il file di certificato non è presente nella directory file system.You will not find a certificate file in the file system directory.

Al prompt di PowerShell digitare:At the PowerShell prompt, type:

Get-ChildItem cert:\CurrentUser\my -codesigning

Questo comando usa il provider di certificati PowerShell per visualizzare le informazioni sul certificato.This command uses the PowerShell Certificate provider to view information about the certificate.

Se il certificato è stato creato, l'output Mostra l' identificazione digitale che identifica il certificato in una visualizzazione simile alla seguente:If the certificate was created, the output shows the thumbprint that identifies the certificate in a display that resembles the following:

Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

Thumbprint                                Subject
----------                                -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF  CN=PowerShell User ]

Firma di uno scriptSign a script

Dopo aver creato un certificato autofirmato, è possibile firmare gli script.After you create a self-signed certificate, you can sign scripts. Se si usa il criterio di esecuzione AllSigned , la firma di uno script consente di eseguire lo script nel computer.If you use the AllSigned execution policy, signing a script permits you to run the script on your computer.

Il seguente script di esempio, Add-Signature.ps1 , firma uno script.The following sample script, Add-Signature.ps1, signs a script. Tuttavia, se si usano i criteri di esecuzione AllSigned , è necessario firmare lo Add-Signature.ps1 script prima di eseguirlo.However, if you are using the AllSigned execution policy, you must sign the Add-Signature.ps1 script before you run it.

Importante

Lo script deve essere salvato utilizzando la codifica ASCII o UTF8NoBOM. È possibile firmare un file script che usa una codifica diversa.The script must be saved using ASCII or UTF8NoBOM encoding.You can sign a script file that uses a different encoding. Tuttavia, lo script non viene eseguito o il modulo che contiene lo script non viene importato.But the script fails to run or the module containing the script fails to import.

Per usare questo script, copiare il testo seguente in un file di testo e denominarlo Add-Signature.ps1 .To use this script, copy the following text into a text file, and name it Add-Signature.ps1.

## Signs a file
param([string] $file=$(throw "Please specify a filename."))
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature $file $cert

Per firmare il Add-Signature.ps1 file di script, digitare i comandi seguenti al prompt dei comandi di PowerShell:To sign the Add-Signature.ps1 script file, type the following commands at the PowerShell command prompt:

$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature add-signature.ps1 $cert

Dopo che lo script è stato firmato, è possibile eseguirlo nel computer locale.After the script is signed, you can run it on the local computer. Tuttavia, lo script non viene eseguito nei computer in cui i criteri di esecuzione di PowerShell richiedono una firma digitale di un'autorità attendibile.However, the script will not run on computers on which the PowerShell execution policy requires a digital signature from a trusted authority. Se si prova, in PowerShell viene visualizzato il messaggio di errore seguente:If you try, PowerShell displays the following error message:

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, trattare il file come si tratterebbe di qualsiasi script non firmato.If PowerShell displays this message when you run a script that you did not write, treat the file as you would treat any unsigned script. Esaminare il codice per determinare se è possibile considerare attendibile lo script.Review the code to determine whether you can trust the script.

Abilitare la protezione avanzata con chiave privata per il certificatoEnable strong private key protection for your certificate

Se si dispone di un certificato privato nel computer, i programmi dannosi potrebbero essere in grado di firmare gli script per conto dell'utente, che autorizza PowerShell a eseguirli.If you have a private certificate on your computer, malicious programs might be able to sign scripts on your behalf, which authorizes PowerShell to run them.

Per evitare la firma automatica per conto dell'utente, usare Gestione certificati Certmgr.exe per esportare il certificato di firma in un .pfx file.To prevent automated signing on your behalf, use Certificate Manager Certmgr.exe to export your signing certificate to a .pfx file. Gestione certificati è incluso in Microsoft .NET SDK, nel Microsoft Windows SDK e in Internet Explorer.Certificate Manager is included in the Microsoft .NET SDK, the Microsoft Windows SDK, and in internet Explorer.

Per esportare il certificato:To export the certificate:

  1. Avviare Gestione certificati.Start Certificate Manager.
  2. Selezionare il certificato emesso dalla radice del certificato locale di PowerShell.Select the certificate issued by PowerShell Local Certificate Root.
  3. Fare clic su Esporta per avviare l'esportazione guidata certificati.Click Export to start the Certificate Export Wizard.
  4. Selezionare "Sì, Esporta la chiave privata", quindi fare clic su Avanti.Select "Yes, export the private key", and then click Next.
  5. Selezionare "Abilita protezione avanzata".Select "Enable strong protection."
  6. Digitare una password, quindi digitarla di nuovo per confermare.Type a password, and then type it again to confirm.
  7. Digitare il nome di un file con estensione pfx.Type a file name that has the .pfx file name extension.
  8. Fare clic su Fine.Click Finish.

Per importare nuovamente il certificato:To re-import the certificate:

  1. Avviare Gestione certificati.Start Certificate Manager.
  2. Fare clic su Importa per avviare l'importazione guidata certificati.Click Import to start the Certificate Import Wizard.
  3. Aprire il percorso del file con estensione pfx creato durante il processo di esportazione.Open to the location of the .pfx file that you created during the export process.
  4. Nella pagina password selezionare "Abilita protezione avanzata chiave privata", quindi immettere la password assegnata durante il processo di esportazione.On the Password page, select "Enable strong private key protection", and then enter the password that you assigned during the export process.
  5. Selezionare l'archivio certificati personale.Select the Personal certificate store.
  6. Fare clic su Fine.Click Finish.

Impedisci la scadenza della firmaPrevent the signature from expiring

La firma digitale in uno script è valida fino alla scadenza del certificato di firma o fino a quando un server di timestamp è in grado di verificare che lo script sia stato firmato mentre il certificato di firma era valido.The digital signature in a script is valid until the signing certificate expires or as long as a timestamp server can verify that the script was signed while the signing certificate was valid.

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.Because most signing certificates are valid for one year only, using a time stamp server ensures that users can use your script for many years to come.

Vedere ancheSee also

about_Execution_Policiesabout_Execution_Policies

about_Profilesabout_Profiles

Get-ExecutionPolicyGet-ExecutionPolicy

Set-ExecutionPolicySet-ExecutionPolicy

Set-AuthenticodeSignatureSet-AuthenticodeSignature

Introduzione alla firma del codiceIntroduction to Code Signing