Цифровая подпись сценария PowerShell (файл *.PS1) позволяет проверить, что сценарий подписан известным доверенным издателем и что его код не был изменен. Специальная Подписание кода сертификаты следует использовать для подписи файлов сценариев PowerShell.

Этот тип сертификата:

  • Может быть запрошен у внутреннего корпоративного центра сертификации (CA).
    Если вы развернули PKI в службе сертификации Active Directory, включите опцию Подписание кода шаблон и запросите сертификат, используя этот шаблон.

    enterprise ca - создание сертификата из шаблона подписи кода

  • Его можно приобрести у внешнего коммерческого органа.
  • Можно выпустить самоподписанный сертификат.

Итак, у вас должен быть файл сертификата закрытого ключа в .PFX (X509). Импортируйте этот сертификат в локальное хранилище сертификатов на вашем компьютере:

$PlainTextCertificatePassword = "MyCertPassw0rd123456"
$pfxpass = $PlainTextCertificatePassword |ConvertTo-SecureString -AsPlainText -Force
Import-PfxCertificate -filepath "C:\PS\test.pfx" cert:\LocalMachine\my -Password $pfxpass

Если вы хотите использовать самоподписанный сертификат, вы можете сгенерировать сертификат подписи кода с помощью команды New-SelfSignedCertificate PowerShell:

$certFile = New-SelfSignedCertificate -Subject "Certificate to sign PowerShell my scripts" -Type CodeSigningCert -DnsName $env:computername -CertStoreLocation cert:\LocalMachine\my

Подписание кода сценария PowerShell с помощью сертификата подписи кода

Список доступных сертификатов подписи кода в указанном локальном хранилище сертификатов:

Get-ChildItem cert:\LocalMachine\my -CodeSigningCert

Выбор сертификата по его отпечатку пальца:

$signcert = Get-ChildItem -Path "cert:\LocalMachine\my" | ? Thumbprint -eq F00AB752B63F3B840A44BF6A20F6EF0E25DEF4D

Чтобы подписать код указанного файла сценария PowerShell, выполните команду

$PSScript = "C:\PS\HardwareReadiness.ps1"
$TimestampServer = "http://timestamp.verisign.com/scripts/timstamp.dll"
Set-AuthenticodeSignature -FilePath $PSScript -Certificate $signcert -TimestampServer $TimestampServer

При попытке подписать сценарий с помощью обычного сертификата SSL/TLS возникает ошибка:

Set-AuthenticodeSignature : Cannot sign code. The specified certificate is not suitable for code signing.

Set-AuthenticodeSignature sign powershell script

Этот сценарий PowerShell проверяет аппаратное обеспечение компьютера на совместимость с Windows 11.

Команда Set-AuthenticodeSignature добавляет блок цифровой подписи в конец текстового файла PS1:

# SIG # Begin signature block
...........
...........
# SIG # End signature block

Блок подписи содержит хэш сценария, зашифрованный с помощью закрытого ключа

блок подписи в файле сценария powershell

Откройте свойства файла PS1 и перейдите к пункту Цифровые подписи вкладка. Информацию о цифровой подписи и сертификате файла можно найти здесь.

подписанный файл сценария powershell

Запуск подписанных сценариев PowerShell в Windows

Стандартные настройки политики выполнения сценариев PowerShell в Windows блокируют выполнение всех сценариев PS1 (Ограничено режим). Если вы попытаетесь запустить скрипт сейчас, то получите ошибку:

File C:\PS\HardwareReadiness.ps1 cannot be loaded because running scripts is disabled on this system.

Измените параметр политики выполнения на AllSigned. Это позволяет запускать только подписанные файлы сценариев PowerShell. Параметры политики выполнения можно изменять:

  • С помощью команды: Set-ExecutionPolicy AllSigned –Force
  • С помощью групповой политики: включить Включить выполнение сценариев политика в разделе Конфигурация компьютера -> Политики -> Административные шаблоны -> Компоненты Windows -> Windows PowerShell и измените значение на Разрешить только подписанные сценарии

Проверьте текущие настройки политики выполнения:

Get-ExecutionPolicy

политика выполнения powershell разрешить запуск только подписанных файлов

При попытке запустить подписанный сценарий PowerShell возникает ошибка:

File C:\PS\HardwareReadiness.ps1 cannot be loaded. A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.

невозможно загрузить сценарий powershell корневой сертификат не доверяется

Добавьте отпечаток сертификата в список корневых доверенных сертификатов, чтобы запустить подписанный файл сценария PowerShell. Вы можете скопировать и вставить сертификат с кодовой подписью, который вы использовали, из хранилища Personal в Доверенный корневой центр сертификации и Надежный издатель магазины, использующие certlm.msc графической консоли.

копирование сертификата подписи кода в список доверенных издателей

Совет. Вы можете развернуть сертификаты на компьютерах домена с помощью GPO. Добавьте сертификат в разделы Public Key GPO: Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Public Key Policies -> Доверенные корневые центры сертификации и Доверенные издательства.Не забывайте регулярно проверять хранилище сертификатов Windows на наличие подозрительных сертификатов и обновлять списки доверенных корневых сертификатов.

Теперь подписанный сценарий PowerShell будет выполняться без предупреждений.

запуск подписанного сценария powershell

Чтобы проверить, что сценарий PowerShell имеет действительную подпись, выполните команду:

Get-AuthenticodeSignature C:\PS\HardwareReadiness.ps1

  • Действительная статус указывает на то, что код сценария PowerShell подписан надежной цифровой подписью и не был изменен.
  • Если команда возвращает HashMismatch, это означает, что код скрипта был изменен после подписания и сертификат больше не действителен. Выполнение такого скрипта будет заблокировано с ошибкой:
    File .ps1 cannot be loaded. The contents of file .ps1 might have been changed by an unauthorized user or process, because the hash of the file does not match the hash stored in the digital signature.

Get-AuthenticodeSignature проверка действительности подписанного скрипта

Это означает, что если в код подписанного PS1-файла вносятся какие-либо изменения или срок действия сертификата истек, его необходимо заново подписать на компьютере с закрытым ключом.

Подписание рекомендуется для всех сценариев PowerShell, выполняемых на повышенных уровнях администратора домена или сервера, а также для сценариев запуска/входа в систему PowerShell в GPO домена.