Cómo firmar un archivo de script de PowerShell (PS1) para mayor seguridad y autenticidad

Gestionar scripts de PowerShell y sus firmas puede ser un verdadero dolor de cabeza, sobre todo si intentas asegurarte de que sean seguros y confiables. Si alguna vez te has encontrado con errores de firma o confianza, es porque Windows es bastante exigente con la ejecución de scripts que no están correctamente firmados o provienen de fuentes no confiables. Sinceramente, en algunas configuraciones, la firma parece sencilla: obtienes el certificado, firmas el script y listo. Pero en otras ocasiones, Windows presenta obstáculos, como errores de confianza o restricciones de políticas. Es un poco molesto, pero una vez superados los obstáculos iniciales, no es tan grave. Esta guía explica cómo firmar correctamente esos scripts de PowerShell, cómo administrar certificados y qué hacer si Windows no funciona correctamente. Al final, podrás ejecutar tus scripts de comprobación de hardware (o cualquier otra cosa que necesites) sin recibir esos errores de «no confiable», siempre que tus certificados estén configurados correctamente. Porque, por supuesto, Windows tiene que hacerlo más difícil de lo necesario.

Cómo firmar scripts de PowerShell con un certificado de firma de código

Método 1: Utilizar un certificado de firma de código adquirido o interno

Esto tiene sentido si tiene un certificado de una CA externa o del sistema PKI interno de su empresa. Estos certificados son de confianza por defecto, por lo que firmar sus scripts con ellos suele suponer menos problemas para Windows. Ayudan a garantizar que los scripts no hayan sido manipulados, especialmente en entornos empresariales o de dominio. Al firmar un script, Windows reconoce que la firma proviene de una fuente de confianza, por eso la firma es tan crucial para esos scripts protegidos.

Antes de firmar, deberá importar su certificado al almacén local. Para ello, abra PowerShell como administrador y ejecute:

$pfxPassword = ConvertTo-SecureString "YourPFXPassword" -AsPlainText -Force Import-PfxCertificate -FilePath "C:\Path\To\YourCert.pfx" -CertStoreLocation cert:\LocalMachine\My -Password $pfxPassword

Esto importa el certificado al almacén de certificados de Windows, lo que lo hace accesible para firmar. Algunos usuarios encuentran que al ejecutarlo, es un poco complicado: a veces funciona de inmediato, otras no. Reiniciar ayuda a veces, o volver a importarlo si no aparece.

Método 2: Creación de un certificado autofirmado para pruebas o uso interno

Si solo está haciendo pruebas o no quiere comprar un certificado, generar un certificado de firma de código autofirmado puede ser muy rápido. Use el comando New-SelfSignedCertificate de PowerShell. Es casi mágico, pero la idea general es la siguiente:

$cert = New-SelfSignedCertificate -Subject "CN=MyCodeSigningCert" -Type CodeSigningCert -DnsName $env:COMPUTERNAME -CertStoreLocation "cert:\LocalMachine\My"

Esto crea un certificado con el que puedes firmar scripts, pero ten cuidado: no será de confianza por defecto en otras máquinas. Tendrás que agregarlo manualmente al almacén raíz de confianza en cada máquina donde quieras ejecutar los scripts firmados, lo cual es un proceso complejo, pero a veces necesario en redes aisladas o entornos de prueba.

Firma tu guion

Una vez que su certificado esté en la tienda, búsquelo por su huella digital y firme su script:

$cert = Get-ChildItem cert:\LocalMachine\My | ? Thumbprint -eq "PUT_THUMBPRINT_HERE" $scriptPath = "C:\Path\To\YourScript.ps1" Set-AuthenticodeSignature -FilePath $scriptPath -Certificate $cert -TimestampServer "http://timestamp.verisign.com/scripts/timstamp.dll"

Este comando coloca una firma al final del archivo de script. Verás un bloque de firma que parece un montón de datos codificados; da un poco de miedo, pero está bien. Si todo está correcto, el estado indicará «Válido».De lo contrario, recibirás errores como «certificado no apto» o «raíz no confiable».

Consejo profesional: a veces, la firma falla porque la cadena de certificados no es completamente confiable, especialmente con certificados autofirmados. Asegúrate de haber importado el certificado de la CA raíz a tu almacén de certificados raíz de confianza y el de la CA emisora ​​a los editores de confianza. Puedes hacerlo certlm.mscsimplemente arrastrando y soltando los certificados en los almacenes correctos. Es bastante sencillo, pero requiere acceso de administrador.

Cómo hacer que PowerShell acepte sus firmas y ejecute scripts

Ajustar la política de ejecución

De forma predeterminada, PowerShell bloquea los scripts por completo (Restringido).Para ejecutar los scripts firmados, debe reducir este parámetro un poco. Configure la política de ejecución en AllSigned, lo que significa que solo se ejecutarán los scripts firmados. Ejecute lo siguiente:

Set-ExecutionPolicy AllSigned -Force

Esto obliga a PowerShell a ejecutar solo scripts con una firma válida, lo cual es muy bueno para la seguridad. Para comprobar la configuración actual, ejecute:

Get-ExecutionPolicy

Si ve «Restringido» o «Firmado remotamente» y desea permitir la ejecución de scripts firmados, cambiarlo puede ser útil. Tenga en cuenta que, en algunas políticas de seguridad (como en grupos corporativos), es posible que necesite derechos de administrador o cambios en la política de grupo.

Confíe en sus certificados

Si encuentra errores sobre certificados no confiables, como «cadena procesada pero terminada en un certificado raíz no confiable», es posible que deba agregar su certificado de firma a las autoridades de certificación raíz de confianza. Esta es una solución un tanto lenta, pero necesaria, especialmente si usa un certificado autofirmado. Y sí, esto significa importar su certificado a las Autoridades de Certificación Raíz de Confianza para el equipo local o el almacén de usuarios mediante certlm.msc.

Si desea hacerlo de forma centralizada, la mejor opción es implementar certificados mediante la directiva de grupo. Simplemente agregue el certificado de la CA raíz a la sección «Autoridades de certificación raíz de confianza» en la GPO.

Verificando la firma de su script

Para verificar si su script está firmado correctamente y es confiable, ejecute:

Get-AuthenticodeSignature -FilePath "C:\Path\To\YourScript.ps1"

El «Estado» debería indicar «Válido». Si muestra algo diferente, como «HashMismatch», significa que el script se modificó después de firmarlo o que la firma ya no es válida. En ese caso, deberá volver a firmar el script.

Nota rápida: Incluso si su script está firmado, Windows podría bloquearlo si la CA raíz no es de confianza o si la cadena de certificados no está completa. Por eso, confiar en sus certificados manualmente o mediante una GPO suele ser necesario en entornos empresariales.

Ejecutando su script firmado

Una vez configurado todo esto, debería poder ejecutar su script sin errores relacionados con la firma. Simplemente haga doble clic o ejecútelo desde PowerShell con >.\HardwareReadiness.ps1. Tenga en cuenta que, si tiene una política de ejecución más estricta (como AllSigned o Unrestricted), deberá estar sincronizada con la configuración de su política para que los scripts se ejecuten correctamente.

  • Asegúrese de que su certificado sea válido y confiable
  • Establecer políticas de ejecución adecuadas
  • Vuelva a importar o confíe en sus certificados si las firmas aún no son aceptadas
  • Volver a firmar los scripts si el código cambia después de firmarlos

Resumen

  • Importe su certificado de firma de código, ya sea de una CA o autofirmado
  • Utilice PowerShell para firmar scripts conSet-AuthenticodeSignature
  • Ajustar las políticas de ejecución para permitir scripts firmados
  • Confíe en su cadena de certificados importando los certificados necesarios en tiendas de confianza
  • Verificar firmas conGet-AuthenticodeSignature

Resumen

Obtener scripts firmados y confiables no siempre es tan sencillo como debería, pero una vez que tienes los certificados instalados y entiendes cómo Windows verifica la firma, todo se simplifica. Es especialmente útil para scripts de automatización o configuraciones empresariales donde la seguridad es importante. No sé por qué funciona, pero a veces reiniciar PowerShell o incluso todo el equipo ayuda cuando los certificados no se reconocen inmediatamente. Simplemente revisa la validez de tu certificado y la cadena de confianza, y deberías estar listo. Espero que esto le ahorre algunas horas a alguien.