about_Signing

Descripción breve

Explica cómo firmar scripts para que cumplan las directivas de ejecución de PowerShell.

Descripción larga

Esta información solo se aplica a PowerShell que se ejecuta en Windows.

La directiva de ejecución restringida no permite que se ejecuten scripts. Las directivas de ejecución AllSigned y RemoteSigned impiden que PowerShell ejecute scripts que no tengan una firma digital.

En este tema se explica cómo ejecutar scripts seleccionados que no están firmados, incluso mientras la directiva de ejecución es RemoteSigned y cómo firmar scripts para su propio uso.

PowerShell comprueba la firma Authenticode de los siguientes tipos de tipo:

  • .ps1 archivos de script
  • .psm1 archivos de módulo
  • .psd1 manifiesto de módulo y archivos de datos
  • .ps1xml tipo y formato de archivos XML
  • .cdxml Archivos de script CDXML
  • .xaml Archivos de script XAML

Para obtener más información sobre las directivas de ejecución de PowerShell, consulte about_Execution_Policies.

Para permitir que se ejecuten scripts firmados

Al iniciar PowerShell en un equipo por primera vez, es probable que la directiva de ejecución restringida , que es el valor predeterminado, esté en vigor.

La directiva restringida no permite que se ejecuten scripts.

Para buscar la directiva de ejecución efectiva en el equipo, escriba:

Get-ExecutionPolicy

Para ejecutar scripts sin firmar que escriba en el equipo local y scripts firmados de otros usuarios, inicie PowerShell con la opción Ejecutar como administrador y, a continuación, use el siguiente comando para cambiar la directiva de ejecución en el equipo a RemoteSigned:

Set-ExecutionPolicy RemoteSigned

Para obtener más información, consulte el tema de ayuda del Set-ExecutionPolicy cmdlet .

Ejecución de scripts sin firmar mediante la directiva de ejecución RemoteSigned

Si la directiva de ejecución de PowerShell es RemoteSigned, PowerShell no ejecutará scripts sin firmar descargados de Internet, incluidos los scripts sin firmar que reciba a través de programas de mensajería instantánea y correo electrónico.

Si intenta ejecutar un script descargado, PowerShell muestra el siguiente mensaje de error:

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 ejecutar el script, revise el código para asegurarse de que confía en él. Los scripts tienen el mismo efecto que cualquier programa ejecutable.

Para ejecutar un script sin firmar, use el Unblock-File cmdlet o use el procedimiento siguiente.

  1. Guarde el archivo de script en el equipo.
  2. Haga clic en Inicio, en Mi equipo y busque el archivo de script guardado.
  3. Haga clic con el botón derecho en el archivo de script y, a continuación, haga clic en Propiedades.
  4. Haga clic en Desbloquear.

Si un script que se descargó de Internet está firmado digitalmente, pero aún no ha elegido confiar en su publicador, PowerShell muestra el siguiente mensaje:

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"):

Si confía en el publicador, seleccione Ejecutar una vez o Ejecutar siempre. Si no confía en el publicador, seleccione Nunca ejecutar o No ejecutar. Si selecciona Nunca ejecutar o Ejecutar siempre, PowerShell no le pedirá de nuevo este publicador.

Métodos de firma de scripts

Puede firmar los scripts que escriba y los scripts que obtenga de otros orígenes. Antes de firmar cualquier script, examine cada comando para comprobar que es seguro ejecutarlo.

Para obtener procedimientos recomendados sobre la firma de código, consulte Procedimientos recomendados de firma de código.

Para obtener más información sobre cómo firmar un archivo de script, consulte Set-AuthenticodeSignature.

El New-SelfSignedCertificate cmdlet, introducido en el módulo PKI en PowerShell 3.0, crea un certificado autofirmado adecuado para las pruebas. Para obtener más información, consulte el tema de ayuda del New-SelfSignedCertificate cmdlet .

Para agregar una firma digital a un script, debe firmarla con un certificado de firma de código. Dos tipos de certificados son adecuados para firmar un archivo de script:

  • Certificados creados por una entidad de certificación: por una cuota, una entidad de certificación pública comprueba su identidad y le proporciona un certificado de firma de código. Al comprar el certificado de una entidad de certificación de reputación, puede compartir el script con los usuarios de otros equipos que ejecutan Windows porque esos otros equipos confían en la entidad de certificación.

  • Certificados que cree: puede crear un certificado autofirmado para el que el equipo es la entidad que crea el certificado. Este certificado es gratuito y le permite escribir, firmar y ejecutar scripts en el equipo. Sin embargo, un script firmado por un certificado autofirmado no se ejecutará en otros equipos.

Normalmente, usaría un certificado autofirmado solo para firmar scripts que escriba para su propio uso y para firmar scripts que obtenga de otros orígenes que haya comprobado que son seguros. No es adecuado para los scripts que se compartirán, incluso dentro de una empresa.

Si crea un certificado autofirmado, asegúrese de habilitar la protección de clave privada segura en el certificado. Esto impide que los programas malintencionados firman scripts en su nombre. Las instrucciones se incluyen al final de este tema.

Crear un certificado autofirmado

Para crear un certificado autofirmado, use el cmdlet New-SelfSignedCertificate en el módulo PKI. Este módulo se presenta en PowerShell 3.0. Para obtener más información, consulte el tema de ayuda del New-SelfSignedCertificate cmdlet .

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

Uso de Makecert.exe

Para crear un certificado autofirmado en versiones anteriores de Windows, use la herramienta MakeCert.exeCreación de certificados . Esta herramienta se incluye en el SDK de Microsoft .NET (versiones 1.1 y posteriores) y en Microsoft Windows SDK.

Para obtener más información sobre la sintaxis y las descripciones de parámetros de la MakeCert.exe herramienta, vea Herramienta de creación de certificados (MakeCert.exe).

Para usar la MakeCert.exe herramienta para crear un certificado, ejecute los siguientes comandos en una ventana del símbolo del sistema del SDK.

Nota:

El primer comando crea una entidad de certificación local para el equipo. El segundo comando genera un certificado personal de la entidad de certificación. Puede copiar o escribir los comandos exactamente como aparecen. No es necesario realizar sustituciones, aunque puede cambiar el nombre del 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

La MakeCert.exe herramienta le pide una contraseña de clave privada. La contraseña garantiza que nadie pueda usar ni acceder al certificado sin su consentimiento. Cree y escriba una contraseña que pueda recordar. Usará esta contraseña más adelante para recuperar el certificado.

Para comprobar que el certificado se generó correctamente, use el siguiente comando para obtener el certificado en el almacén de certificados del equipo. No encontrará un archivo de certificado en el directorio del sistema de archivos.

En el símbolo del sistema de PowerShell, escriba:

Get-ChildItem cert:\CurrentUser\my -codesigning

Este comando usa el proveedor de certificados de PowerShell para ver información sobre el certificado.

Si se creó el certificado, la salida muestra la huella digital que identifica el certificado en una pantalla similar a la siguiente:

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

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

Firmar un script

Después de crear un certificado autofirmado, puede firmar scripts. Si usa la directiva de ejecución AllSigned , la firma de un script le permite ejecutar el script en el equipo.

El siguiente script de ejemplo, Add-Signature.ps1, firma un script. Sin embargo, si usa la directiva de ejecución AllSigned , debe firmar el Add-Signature.ps1 script antes de ejecutarlo.

Importante

Antes de PowerShell 7.2, el script debe guardarse mediante la codificación ASCII o UTF8NoBOM. PowerShell 7.2 y versiones posteriores admiten scripts firmados para cualquier formato de codificación.

Para usar este script, copie el texto siguiente en un archivo de texto y asígnelo Add-Signature.ps1el nombre .

## 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 firmar el archivo de Add-Signature.ps1 script, escriba los siguientes comandos en el símbolo del sistema de PowerShell:

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

Set-AuthenticodeSignature add-signature.ps1 $cert

Después de firmar el script, puede ejecutarlo en el equipo local. Sin embargo, el script no se ejecutará en equipos en los que la directiva de ejecución de PowerShell requiera una firma digital de una entidad de confianza. Si intenta, PowerShell muestra el siguiente mensaje de error:

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

Si PowerShell muestra este mensaje al ejecutar un script que no ha escrito, trate el archivo como trataría cualquier script sin firmar. Revise el código para determinar si puede confiar en el script.

Habilitación de la protección segura para la clave privada

Si tiene una clave privada y un certificado en el equipo, es posible que los programas malintencionados puedan firmar scripts en su nombre, lo que autoriza a PowerShell a ejecutarlos.

Para evitar la firma automatizada en su nombre, use el Administrador Certmgr.exe de certificados para exportar la clave de firma y el certificado a un .pfx archivo. El Administrador de certificados se incluye en el SDK de Microsoft .NET, microsoft Windows SDK y en Internet Explorer.

Para exportar el certificado:

  1. Inicie el Administrador de certificados.
  2. Seleccione el certificado emitido por la raíz del certificado local de PowerShell.
  3. Haga clic en Exportar para iniciar el Asistente para exportar certificados.
  4. Seleccione Exportar la clave privada y, después, haga clic en Siguiente.
  5. Seleccione Habilitar protección segura.
  6. Escriba una contraseña y vuelva a escribirla para confirmarla.
  7. Escriba un nombre de archivo que tenga la .pfx extensión de nombre de archivo.
  8. Haga clic en Finalizar

Para volver a importar el certificado:

  1. Inicie el Administrador de certificados.
  2. Haga clic en Importar para iniciar el Asistente para importación de certificados.
  3. Abra en la ubicación del .pfx archivo que creó durante el proceso de exportación.
  4. En la página Contraseña, seleccione Habilitar protección de clave privada segura y, a continuación, escriba la contraseña que asignó durante el proceso de exportación.
  5. Seleccione el almacén de certificados Personal.
  6. Haga clic en Finalizar

Impedir que la firma expire

La firma digital de un script es válida hasta que expira el certificado de firma o siempre que un servidor de marca de tiempo pueda comprobar que el script se firmó mientras el certificado de firma era válido.

Dado que la mayoría de los certificados de firma son válidos solo durante un año, el uso de un servidor de marca de tiempo garantiza que los usuarios puedan usar el script durante muchos años.

Consulte también