about_Signing

Breve descrição

Explica como assinar scripts para que eles estejam em conformidade com as políticas de execução do PowerShell.

Descrição longa

Essas informações só se aplicam ao PowerShell em execução no Windows.

A política de execução restrita não permite a execução de nenhum script. As políticas de execução AllSigned e RemoteSigned impedem que o PowerShell execute scripts que não tenham uma assinatura digital.

Este tópico explica como executar scripts selecionados que não são assinados, mesmo quando a política de execução é RemoteSigned, e como assinar scripts para seu próprio uso.

O PowerShell verifica a assinatura Authenticode dos seguintes tipos de tipo:

  • .ps1 arquivos de script
  • .psm1 Arquivos de módulo
  • .psd1 manifesto do módulo e arquivos de dados
  • .ps1xml digitar e formatar arquivos XML
  • .cdxml Arquivos de script CDXML
  • .xaml Arquivos de script XAML

Para obter mais informações sobre políticas de execução do PowerShell, consulte about_Execution_Policies.

Para permitir a execução de scripts assinados

Quando você inicia o PowerShell em um computador pela primeira vez, a política de execução restrita , que é o padrão, provavelmente estará em vigor.

A política Restrita não permite a execução de nenhum script.

Para localizar a política de execução efetiva no seu computador, digite:

Get-ExecutionPolicy

Para executar scripts não assinados que você escreve em seu computador local e scripts assinados de outros usuários, inicie o PowerShell com a opção Executar como Administrador e use o seguinte comando para alterar a diretiva de execução no computador para RemoteSigned:

Set-ExecutionPolicy RemoteSigned

Para obter mais informações, consulte o tópico de ajuda do Set-ExecutionPolicy cmdlet.

Executando scripts não assinados usando a diretiva de execução RemoteSigned

Se sua política de execução do PowerShell for RemoteSigned, o PowerShell não executará scripts não assinados baixados da Internet, incluindo scripts não assinados recebidos por email e programas de mensagens instantâneas.

Se você tentar executar um script baixado, o PowerShell exibirá a seguinte mensagem de erro:

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.

Antes de executar o script, revise o código para ter certeza de que você confia nele. Os scripts têm o mesmo efeito que qualquer programa executável.

Para executar um script não assinado, use o Unblock-File cmdlet ou o procedimento a seguir.

  1. Salve o arquivo de script no seu computador.
  2. Clique em Iniciar, clique em Meu Computador e localize o arquivo de script salvo.
  3. Clique com o botão direito do rato no ficheiro de script e, em seguida, clique em Propriedades.
  4. Clique em Desbloquear.

Se um script que foi baixado da Internet estiver assinado digitalmente, mas você ainda não tiver escolhido confiar em seu editor, o PowerShell exibirá a seguinte mensagem:

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 confiar no editor, selecione Executar uma vez ou Executar sempre. Se você não confiar no editor, selecione Nunca executar ou Não executar. Se você selecionar Nunca executar ou Sempre executar, o PowerShell não solicitará novamente para este editor.

Métodos de assinatura de scripts

Você pode assinar os scripts que você escreve e os scripts que você obtém de outras fontes. Antes de assinar qualquer script, examine cada comando para verificar se é seguro executá-lo.

Para obter práticas recomendadas sobre assinatura de código, consulte Práticas recomendadas de assinatura de código.

Para obter mais informações sobre como assinar um arquivo de script, consulte Set-AuthenticodeSignature.

O New-SelfSignedCertificate cmdlet, introduzido no módulo PKI no PowerShell 3.0, cria um certificado autoassinado que é apropriado para teste. Para obter mais informações, consulte o tópico de ajuda do New-SelfSignedCertificate cmdlet.

Para adicionar uma assinatura digital a um script, você deve assiná-lo com um certificado de assinatura de código. Dois tipos de certificados são adequados para assinar um arquivo de script:

  • Certificados criados por uma autoridade de certificação: por uma taxa, uma autoridade de certificação pública verifica sua identidade e fornece um certificado de assinatura de código. Ao comprar seu certificado de uma autoridade de certificação respeitável, você pode compartilhar seu script com usuários em outros computadores que executam o Windows porque esses outros computadores confiam na autoridade de certificação.

  • Certificados criados: você pode criar um certificado autoassinado para o qual seu computador é a autoridade que cria o certificado. Este certificado é gratuito e permite-lhe escrever, assinar e executar scripts no seu computador. No entanto, um script assinado por um certificado autoassinado não será executado em outros computadores.

Normalmente, você usaria um certificado autoassinado apenas para assinar scripts que você escreve para seu próprio uso e para assinar scripts que você obtém de outras fontes que você verificou serem seguras. Não é apropriado para scripts que serão compartilhados, mesmo dentro de uma empresa.

Se você criar um certificado autoassinado, certifique-se de habilitar a proteção forte de chave privada em seu certificado. Isso impede que programas mal-intencionados assinem scripts em seu nome. As instruções estão incluídas no final deste tópico.

Criar um certificado autoassinado

Para criar um certificado autoassinado, use o cmdlet New-SelfSignedCertificate no módulo PKI. Este módulo é introduzido no PowerShell 3.0. Para obter mais informações, consulte o tópico de ajuda do New-SelfSignedCertificate cmdlet.

$params = @{
    Subject = 'CN=PowerShell Code Signing Cert'
    Type = 'CodeSigning'
    CertStoreLocation = 'Cert:\CurrentUser\My'
    HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params

Usando Makecert.exe

Para criar um certificado autoassinado em versões anteriores do Windows, use a ferramenta MakeCert.exeCriação de Certificados . Esta ferramenta está incluída no SDK do Microsoft .NET (versões 1.1 e posteriores) e no SDK do Microsoft Windows.

Para obter mais informações sobre a sintaxe e as descrições de parâmetros da MakeCert.exe ferramenta, consulte Ferramenta de criação de certificados (MakeCert.exe).

Para usar a MakeCert.exe ferramenta para criar um certificado, execute os seguintes comandos em uma janela do prompt de comando do SDK.

Nota

O primeiro comando cria uma autoridade de certificação local para o seu computador. O segundo comando gera um certificado pessoal da autoridade de certificação. Você pode copiar ou digitar os comandos exatamente como eles aparecem. Não são necessárias substituições, embora seja possível alterar o nome do certificado.

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

A MakeCert.exe ferramenta solicita uma senha de chave privada. A palavra-passe garante que ninguém pode utilizar ou aceder ao certificado sem o seu consentimento. Crie e introduza uma palavra-passe de que se lembre. Você usará essa senha mais tarde para recuperar o certificado.

Para verificar se o certificado foi gerado corretamente, use o seguinte comando para obter o certificado no armazenamento de certificados no computador. Você não encontrará um arquivo de certificado no diretório do sistema de arquivos.

No prompt do PowerShell, digite:

Get-ChildItem cert:\CurrentUser\my -codesigning

Este comando usa o provedor de Certificado do PowerShell para exibir informações sobre o certificado.

Se o certificado foi criado, a saída mostra a impressão digital que identifica o certificado em uma exibição semelhante à seguinte:

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

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

Assinar um script

Depois de criar um certificado autoassinado, você pode assinar scripts. Se você usar a política de execução AllSigned , assinar um script permitirá que você execute o script em seu computador.

O script de exemplo a seguir, Add-Signature.ps1, assina um script. No entanto, se você estiver usando a política de execução AllSigned , deverá assinar o script antes de Add-Signature.ps1 executá-lo.

Importante

Antes do PowerShell 7.2, o script deve ser salvo usando a codificação ASCII ou UTF8NoBOM. O PowerShell 7.2 e superior oferece suporte a scripts assinados para qualquer formato de codificação.

Para usar esse script, copie o texto a seguir em um arquivo de texto e nomeie-o Add-Signature.ps1como .

## 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

Para assinar o Add-Signature.ps1 arquivo de script, digite os seguintes comandos no prompt de comando do PowerShell:

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature add-signature.ps1 $cert

Depois de assinar o script, você pode executá-lo no computador local. No entanto, o script não será executado em computadores em que a política de execução do PowerShell exija uma assinatura digital de uma autoridade confiável. Se você tentar, o PowerShell exibirá a seguinte mensagem de erro:

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 o PowerShell exibir essa mensagem quando você executar um script que não escreveu, trate o arquivo como trataria qualquer script não assinado. Revise o código para determinar se você pode confiar no script.

Habilite uma proteção forte para sua chave privada

Se você tiver uma chave privada e um certificado em seu computador, programas mal-intencionados poderão assinar scripts em seu nome, o que autoriza o PowerShell a executá-los.

Para evitar a assinatura automatizada em seu nome, use o Gerenciador de Certmgr.exe Certificados para exportar sua chave de assinatura e certificado para um .pfx arquivo. O Gerenciador de Certificados está incluído no SDK do Microsoft .NET, no SDK do Microsoft Windows e no Internet Explorer.

Para exportar o certificado:

  1. Inicie o Gerenciador de certificados.
  2. Selecione o certificado emitido pela Raiz do Certificado Local do PowerShell.
  3. Clique em Exportar para iniciar o Assistente para Exportação de Certificados.
  4. Selecione Sim, exportar a chave privada e clique em Avançar.
  5. Selecione Ativar proteção forte.
  6. Digite uma senha e digite-a novamente para confirmar.
  7. Digite um nome de arquivo que tenha a extensão do nome do .pfx arquivo.
  8. Clique em Concluir.

Para reimportar o certificado:

  1. Inicie o Gerenciador de certificados.
  2. Clique em Importar para iniciar o Assistente de Importação de Certificados.
  3. Abra o local do .pfx arquivo que você criou durante o processo de exportação.
  4. Na página Palavra-passe, selecione Ativar proteção de chave privada forte e, em seguida, introduza a palavra-passe que atribuiu durante o processo de exportação.
  5. Selecione o armazenamento de certificados pessoal .
  6. Clique em Concluir.

Impedir que a assinatura expire

A assinatura digital em um script é válida até que o certificado de assinatura expire ou enquanto um servidor de carimbo de data/hora puder verificar se o script foi assinado enquanto o certificado de assinatura era válido.

Como a maioria dos certificados de assinatura é válida por apenas um ano, o uso de um servidor de carimbo de data/hora garante que os usuários possam usar seu script por muitos anos.

Consulte também