Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 ejecute ningún script. 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, aunque la directiva de ejecución esté RemoteSignedy cómo firmar scripts para su propio uso.
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 esté en vigor la directiva de ejecución Restringida, que es el valor predeterminado.
La directiva Restringido no permite que se ejecute ningún script.
Para buscar la directiva de ejecución efectiva en tu ordenador, 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 cmdlet Set-ExecutionPolicy.
Ejecución de scripts sin firmar mediante la directiva de ejecución RemoteSigned
Si la directiva de ejecución de PowerShell está RemoteSigned, PowerShell no ejecutará scripts sin firmar descargados de Internet, incluidos los scripts sin firmar que reciba a través del correo electrónico y los programas de mensajería instantánea.
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 cmdlet Unblock-File o use el procedimiento siguiente.
- Guarde el archivo de script en el equipo.
- Haga clic en Inicio, haga clic en Mi equipoy 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 editor, 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 No ejecutar nunca o No ejecutar. Si selecciona No ejecutar nunca o Ejecutar siempre, PowerShell no le pedirá de nuevo para 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 conocer las prácticas recomendadas sobre la firma de código, consulte Code-Signing Prácticas recomendadas.
Para obtener más información sobre cómo firmar un archivo de script, vea Set-AuthenticodeSignature.
El cmdlet New-SelfSignedCertificate, 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 cmdlet New-SelfSignedCertificate.
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 usted crea: puede crear un certificado autofirmado para el cual su equipo es la autoridad que lo genera. 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 los scripts que escriba para su propio uso y para firmar los scripts que obtenga de otros orígenes que haya comprobado que son seguros. No es adecuado para 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.
Creación de 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 cmdlet New-SelfSignedCertificate.
$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 Creación de certificados MakeCert.exe. 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 herramienta MakeCert.exe, vea Certificate Creation Tool (MakeCert.exe).
Para usar la herramienta MakeCert.exe para crear un certificado, ejecute los siguientes comandos en una ventana de comandos 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 herramienta MakeCert.exe 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 un formato similar al 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 usas la política de ejecución AllSigned, la firma de un script te permite ejecutar el script en tu 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 script Add-Signature.ps1 antes de ejecutarlo.
Importante
Antes de PowerShell 7.2, el script debe guardarse mediante el encoding ASCII o UTF8NoBOM. PowerShell 7.2 y versiones posteriores admiten scripts firmados para cualquier formato de encoding.
Para usar este script, copie el texto siguiente en un archivo de texto y asígnelo el nombre 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
Para firmar el archivo de script de Add-Signature.ps1, 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 de certificados Certmgr.exe para exportar la clave de firma y el certificado a un archivo de .pfx.
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 el origen de certificados locales de PowerShell.
- Haga clic en Exportar para iniciar el Asistente para exportar certificados.
- Seleccione Sí, exporte la clave privaday 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 extensión de archivo
.pfx. - Haga clic en Finalizar
Para volver a importar el certificado:
- Inicie el Administrador de certificados.
- Haga clic en Importar para iniciar el Asistente para importar certificados.
- Vaya a la ubicación del archivo
.pfxque creó durante el proceso de exportación. - En la página Contraseña, seleccione Habilitar protección de clave privada seguray, a continuación, escriba la contraseña que asignó durante el proceso de exportación.
- Seleccione el almacenamiento 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.