Как подписать PowerShell скрипт (PS1) с помощью сертификата?

Цифровая подпись у PowerShell скрипта (файла *.PS1) позволяет при запуске удостовериться, что скрипт подписан доверенным издателем и его код не был изменен. Для подписи кода PowerShell скрипта вам нужно получить сертификат типа Code Signing . Такой сертификат можно:

  • Запросить на внутреннем корпоративном центра сертификации (Certificate Authority, CA).
    Если у вас развернут PKI на Active Directory Certificate Services, нужно на нем включить шаблон Code Signing , и запросить сертификат по этому шаблону.
  • Приобрести у внешнего коммерческого центра сертификации
  • Выпустить самоподписанный сертификат

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

$PlainTextPass = "Certpass123456"
$pfxpass = $PlainTextPass |ConvertTo-SecureString -AsPlainText -Force
Import-PfxCertificate -filepath "C:PStest.pfx" cert:LocalMachinemy -Password $pfxpass

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

$certFile = New-SelfSignedCertificate -Subject "Certificate to sign PowerShell sсripts" -Type CodeSigningCert -DnsName $env:computername -CertStoreLocation cert:LocalMachinemy

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

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

Get-ChildItem cert:LocalMachinemy -CodeSigningCert

Выбрать сертификат можно по его отпечатку:

$signcert = Get-ChildItem -Path "cert:LocalMachinemy" | ? Thumbprint -eq 1A719E6D14E4827370457C3DEDD2D08725BAA95B

Чтобы подписать код указанного PowerShell скрипта, выполните:

$PSScript = "C:PSHardwareReadiness.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.

При подписывании файла PowerShell скрипта, командлет Set-AuthenticodeSignature добавляет в конец текстового файла PS1 блок сигнатуры цифровой подписи, обрамленный специальными метками:

# SIG # Begin signature block_x000D_..........._x000D_..........._x000D_# SIG # End signature block

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

В свойствах PS1 файла на вкладке Digital Signatures появится информация о наличии подписи у скрипта и информация о сертификате.

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

По умолчанию настройки политики выполнения PowerShell скриптов в Windows блокируют запуск любых PS1 скриптов (режим Restricted) и при запуске скрипта появится ошибка.

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

Чтобы разрешить запуск только подписанных PowerShell скриптов, нужно изменить настройки политики на AllSigned . Настройки политики выполнения можно изменить:

  • Командой: Set-ExecutionPolicy AllSigned –Force
  • Через групповые политики: Включить выполнение сценариев (Turn on Script Execution) в разделе GPO Computer Configuration -> Policies -> Administrative Templates -> Windows Components -> Windows PowerShell. Измените значение параметра на «Разрешать только подписанные сценарии» (Allow only signed scripts).

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

Get-ExecutionPolicy

Если попробовать запустить сейчас подписанный PowerShell скрипт, появится ошибка:

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

Для запуска подписанного PowerShell скрипта, нужно добавить отпечаток сертификата в корневые доверенные сертификаты. Можно скопировать сертификат из секции Personal в хранилища Trusted Root Certification Authority и Trusted Publisher с помощью графической консоли Certlm.msc (скопируйте сертификат из Personal хранилища и вставьте его в корневые).

Совет . Вы можете централизованно установить сертификат на все компьютеры домена с помощью GPO . Сертфикат нужно поместить в: Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Public Key Policies -> Trusted Root Certification Authorities и Trusted Publishers .

Не забывайте периодически проверять хранилище сертификатов Windows на наличие недоверенных сертфикатов и обновлять списки корневых сертификатов .

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

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

Get-AuthenticodeSignature C:PSHardwareReadiness.ps1

  • Статус Valid указывает, что код 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 скрипты, выполняющиеся с повышенными привилегиями администраторов домена или серверов, а также скрипты, которые запускаются на компьютерах пользователей через GPO .

admin

Share
Published by
admin

Recent Posts

Консоль удаленного рабочего стола(rdp console)

Клиент удаленного рабочего стола (rdp) предоставляет нам возможность войти на сервер терминалов через консоль. Что…

2 недели ago

Настройка сети в VMware Workstation

В VMware Workstation есть несколько способов настройки сети гостевой машины: 1) Bridged networking 2) Network…

2 недели ago

Логи брандмауэра Windows

Встроенный брандмауэр Windows может не только остановить нежелательный трафик на вашем пороге, но и может…

2 недели ago

Правильный способ отключения IPv6

Вопреки распространенному мнению, отключить IPv6 в Windows Vista и Server 2008 это не просто снять…

2 недели ago

Ключи реестра Windows, отвечающие за параметры экранной заставки

Параметры экранной заставки для текущего пользователя можно править из системного реестра, для чего: Запустите редактор…

2 недели ago

Как управлять журналами событий из командной строки

В этой статье расскажу про возможность просмотра журналов событий из командной строки. Эти возможности можно…

2 недели ago