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.
- Guarde el archivo de script en el equipo.
- Haga clic en Inicio, en Mi equipo y busque el archivo de script guardado.
- Haga clic con el botón derecho en el archivo de script y, a continuación, haga clic en Propiedades.
- 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.exe
Creació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.ps1
el 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:
- Inicie el Administrador de certificados.
- Seleccione el certificado emitido por la raíz del certificado local de PowerShell.
- Haga clic en Exportar para iniciar el Asistente para exportar certificados.
- Seleccione Exportar la clave privada y, después, haga clic en Siguiente.
- Seleccione Habilitar protección segura.
- Escriba una contraseña y vuelva a escribirla para confirmarla.
- Escriba un nombre de archivo que tenga la
.pfx
extensión de nombre de archivo. - Haga clic en Finalizar
Para volver a importar el certificado:
- Inicie el Administrador de certificados.
- Haga clic en Importar para iniciar el Asistente para importación de certificados.
- Abra en la ubicación del
.pfx
archivo que creó durante el proceso de exportación. - 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.
- Seleccione el almacén de certificados Personal.
- 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.