about_Signing

Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0

TEMA

about_Signing

DESCRIPCIÓN BREVE

Explica cómo firmar scripts para que se ajusten a las directivas de ejecución de Windows PowerShell®.

DESCRIPCIÓN LARGA

La directiva de ejecución Restringida no permite ejecutar ningún script. Las directivas de ejecución AllSigned y RemoteSigned evitan que Windows PowerShell ejecute scripts que no tienen una firma digital.

En este tema se explica cómo ejecutar scripts seleccionados que no están firmados (aunque la directiva de ejecución sea RemoteSigned) y cómo firmar scripts para su propio uso.

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

PERMITIR LA EJECUCIÓN DE SCRIPTS FIRMADOS

La primera vez que inicie Windows PowerShell en un equipo, es probable que esté en vigor la directiva de ejecución Restringida, que es la predeterminada.

La directiva Restringida no permite ejecutar ningún script.

Para buscar la directiva de ejecución en vigor en su equipo, escriba:

        Get-ExecutionPolicy

Para ejecutar los scripts sin firmar que escribe en el equipo local y los scripts firmados de otros usuarios, inicie Windows PowerShell con la opción Ejecutar como administrador y, luego, 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.

EJECUTAR SCRIPTS SIN FIRMAR (DIRECTIVA DE EJECUCIÓN REMOTESIGNED)

Si la directiva de ejecución de Windows PowerShell es RemoteSigned, Windows PowerShell no ejecutará scripts sin firmar que se descarguen de Internet, incluidos los scripts sin firmar que reciba mediante el correo electrónico y los programas de mensajería instantánea.

Si intenta ejecutar un script descargado, Windows 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.

  • 1. Guarde el archivo de script en el equipo.

  • 2. Haga clic en Inicio, en Mi PC y busque el archivo de script guardado.

  • 3. Haga clic con el botón secundario en el archivo de script y, después, haga clic en Propiedades.

  • 4. Haga clic en Desbloquear.

Si un script descargado de Internet está firmado digitalmente pero todavía no ha optado por confiar en su editor, Windows PowerShell muestra el siguiente mensaje:

  • ¿Desea ejecutar el software de este editor que no es de confianza? El archivo <nombre-archivo> está publicado por CN=<nombre-editor>. Este editor no es de confianza en el sistema. Ejecute únicamente scripts de editores de confianza.

  • [V] [D] de la ejecución no ejecutar nunca [R] de ejecución una vez [A] ejecutar siempre [?] Ayuda (el valor predeterminado es "D"):

  • Si confía en el editor, seleccione "Ejecutar una vez" o "Ejecutar siempre". Si no confía en el editor, seleccione "No ejecutar nunca" o "No ejecutar". Si selecciona "No ejecutar nunca" o "Ejecutar siempre", Windows PowerShell no le volverá a preguntar por este editor.

MÉTODOS PARA FIRMAR SCRIPTS

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

Para ver los procedimientos recomendados sobre la firma de código, consulte "Prácticas recomendadas de la firma de código" en https://go.microsoft.com/fwlink/?LinkId=119096.

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

El cmdlet New-SelfSignedCertificate, introducido en el módulo PKI en Windows PowerShell 3.0, crea un certificado autofirmado que es adecuado para efectuar 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 firmarlo con un certificado de firma de código. Hay dos tipos de certificados adecuados para firmar un archivo de script:

  • -- Los certificados creados por una entidad de certificación:

    Mediante el pago de una cuota, una entidad de certificación pública comprueba su identidad y le proporciona un certificado de firma de código. Al adquirir el certificado de una entidad de certificación de confianza, puede compartir el script con los usuarios de otros equipos que ejecutan Windows, ya que estos equipos confían en la entidad de certificación.

  • -- Los certificados que cree:

    Puede crear un certificado autofirmado del cual 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, los scripts firmados por un certificado autofirmado no se ejecutarán en otros equipos.

En un caso normal, usaría un certificado autofirmado solo para firmar los scripts que haya escrito para su propio uso y para firmar los scripts que haya obtenido de otros orígenes (y ha comprobado que son seguros). No es adecuado para los scripts que se van a compartir, incluso dentro de una empresa.

Si crea un certificado autofirmado, asegúrese de habilitar la protección segura de clave privada en su certificado; esto impide que los programas malintencionados firmen scripts en su nombre. Al final de este tema se incluyen las instrucciones.

CREAR UN CERTIFICADO AUTOFIRMADO

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

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

Para obtener más información sobre la sintaxis y las descripciones de los parámetros de la herramienta MakeCert.exe, consulte "Herramienta de creación de certificados (MakeCert.exe)" en la Biblioteca MSDN (Microsoft Developer Network) en https://go.microsoft.com/fwlink/?LinkId=119097.

Para usar la herramienta MakeCert.exe 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.

Nota: Puede copiar o escribir los comandos exactamente como aparecen. No es necesario sustituir nada, aunque puede cambiar el nombre del certificado.

            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

La herramienta MakeCert.exe le pedirá una contraseña de clave privada. La contraseña garantiza que nadie pueda usar o tener acceso 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á ningún archivo de certificado en el directorio del sistema de archivos).

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

            get-childitem cert:\CurrentUser\my -codesigning

Este comando usa el proveedor de certificados de Windows PowerShell para ver la información del certificado.

Si se creó el certificado, la salida muestra la huella digital que identifica el certificado en una visualización 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 ejecutarlo en el equipo.

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

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

Nota: Asegúrese de que el archivo de script no tiene la extensión de nombre de archivo .txt. Si el editor de texto anexa ".txt", escriba el nombre del archivo entre comillas: "add-signature.ps1".

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

Para firmar el archivo de script Add-Signature.ps1, escriba los siguientes comandos en el símbolo del sistema de Windows PowerShell:

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

Una vez firmado, puede ejecutar el script en el equipo local. Sin embargo, el script no se ejecutará en los equipos en los que la directiva de ejecución de Windows PowerShell requiera una firma digital de una autoridad de confianza. Si lo intenta, Windows PowerShell mostrará 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 Windows PowerShell muestra este mensaje cuando ejecuta un script que no escribió, trate el archivo del mismo modo que trataría cualquier script sin firmar. Revise el código para determinar si puede confiar en el script.

HABILITAR LA PROTECCIÓN SEGURA DE CLAVE PRIVADA PARA EL CERTIFICADO

Si tiene un certificado privado en el equipo, los programas malintencionados podrían firmar scripts en su nombre, lo cual autoriza que Windows PowerShell los ejecute.

Para evitar la firma automática en su nombre, use el Administrador de certificados (Certmgr.exe) para exportar el certificado de firma a un archivo .pfx. El Administrador de certificados se incluye en Microsoft .NET Framework SDK, Microsoft Windows SDK, así como en Internet Explorer 5.0 y en versiones posteriores.

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 exportación de certificados.

  • 4. Seleccione "Sí, exportar la clave privada" y haga clic en Siguiente.

  • 5. Seleccione "Permitir protección segura".

  • 6. Escriba una contraseña y vuelva a escribirla para confirmarla.

  • 7. Escriba un nombre de archivo que tenga la extensión de nombre de archivo .pfx.

  • 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 la ubicación del archivo .pfx que creó durante el proceso de exportación.

  • 4. En la página Contraseña, seleccione "Habilitar protección segura de clave privada" y escriba la contraseña que asignó durante el proceso de exportación.

  • 5. Seleccione el almacén de certificados personales.

  • 6. Haga clic en Finalizar.

IMPEDIR QUE LA FIRMA CADUQUE

La firma digital en un script es válida hasta que el certificado de firma caduque o hasta que un servidor de marca de hora 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 más.

VEA TAMBIÉN

about_Execution_Policies

about_Profiles

Get-ExecutionPolicy

New-SelfSignedCertificate

Set-ExecutionPolicy

Set-AuthenticodeSignature

"Introduction to Code Signing" (https://go.microsoft.com/fwlink/?LinkId=106296)