Цифровая подпись сценария PowerShell (файл *.PS1) позволяет проверить, что сценарий подписан известным доверенным издателем и что его код не был изменен. Специальная Подписание кода сертификаты следует использовать для подписи файлов сценариев PowerShell.
Этот тип сертификата:
- Может быть запрошен у внутреннего корпоративного центра сертификации (CA).
Если вы развернули PKI в службе сертификации Active Directory, включите опцию Подписание кода шаблон и запросите сертификат, используя этот шаблон.
- Его можно приобрести у внешнего коммерческого органа.
- Можно выпустить самоподписанный сертификат.
Итак, у вас должен быть файл сертификата закрытого ключа в .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
Set-AuthenticodeSignature : Cannot sign code. The specified certificate is not suitable for code signing.
Команда Set-AuthenticodeSignature добавляет блок цифровой подписи в конец текстового файла PS1:
# SIG # Begin signature block ........... ........... # SIG # End signature block
Блок подписи содержит хэш сценария, зашифрованный с помощью закрытого ключа
Откройте свойства файла PS1 и перейдите к пункту Цифровые подписи вкладка. Информацию о цифровой подписи и сертификате файла можно найти здесь.
Запуск подписанных сценариев 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 возникает ошибка:
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. Вы можете скопировать и вставить сертификат с кодовой подписью, который вы использовали, из хранилища Personal в Доверенный корневой центр сертификации и Надежный издатель магазины, использующие certlm.msc
графической консоли.
Теперь подписанный сценарий 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.
Это означает, что если в код подписанного PS1-файла вносятся какие-либо изменения или срок действия сертификата истек, его необходимо заново подписать на компьютере с закрытым ключом.
Подписание рекомендуется для всех сценариев PowerShell, выполняемых на повышенных уровнях администратора домена или сервера, а также для сценариев запуска/входа в систему PowerShell в GPO домена.