Поделиться через


about_Signing

Краткое описание

Объясняется, как подписывать скрипты, чтобы они соответствовали политикам выполнения PowerShell.

Подробное описание

Эти сведения относятся только к PowerShell, работающей в Windows.

Политика ограниченного выполнения не разрешает выполнение скриптов. Политики выполнения AllSigned и RemoteSigned не позволяют PowerShell запускать сценарии без цифровой подписи.

В этом разделе объясняется, как выполнять выбранные скрипты, которые не подписаны, даже если политика выполнения — RemoteSigned, и как подписывать скрипты для собственного использования.

Дополнительные сведения о политиках выполнения PowerShell см. в разделе about_Execution_Policies.

Разрешение выполнения подписанных скриптов

При первом запуске PowerShell на компьютере, скорее всего, будет действовать политика ограниченного выполнения, которая используется по умолчанию.

Политика с ограниченным доступом не разрешает выполнение скриптов.

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

Get-ExecutionPolicy

Чтобы запустить неподписанные скрипты, которые вы пишете на локальном компьютере, и подписанные скрипты от других пользователей, запустите PowerShell с параметром Запуск от имени администратора , а затем используйте следующую команду, чтобы изменить политику выполнения на компьютере на RemoteSigned:

Set-ExecutionPolicy RemoteSigned

Дополнительные сведения см. в разделе справки по командлету Set-ExecutionPolicy .

Выполнение неподписанных скриптов с помощью политики выполнения RemoteSigned

Если политика выполнения PowerShell — RemoteSigned, PowerShell не будет запускать неподписанные скрипты, скачанные из Интернета, включая неподписанные скрипты, полученные по электронной почте и в программах обмена мгновенными сообщениями.

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

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.

Перед запуском скрипта просмотрите код, чтобы убедиться, что вы доверяете ему. Скрипты имеют тот же эффект, что и любая исполняемая программа.

Чтобы запустить неподписанный скрипт, используйте Unblock-File командлет или следующую процедуру.

  1. Сохраните файл скрипта на компьютере.
  2. Нажмите кнопку Пуск, выберите Пункт Мой компьютер и найдите сохраненный файл скрипта.
  3. Щелкните правой кнопкой мыши файл скрипта и выберите пункт Свойства.
  4. Нажмите кнопку Снять блокировку.

Если скрипт, скачанный из Интернета, имеет цифровую подпись, но вы еще не решили доверять его издателю, PowerShell отобразит следующее сообщение:

Do you want to run software from this untrusted publisher?
The file <file-name> is published by CN=<publisher-name>. This
publisher is not trusted on your system. Only run scripts
from trusted publishers.

[V] Never run  [D] Do not run  [R] Run once  [A] Always run
[?] Help (default is "D"):

Если вы доверяете издателю, выберите Выполнить один раз или Всегда выполнять. Если вы не доверяете издателю, выберите Параметр Никогда не выполнять или Не запускать. Если выбрать Никогда не выполнять или Всегда запускать, PowerShell больше не будет запрашивать этот издатель.

Методы подписывания скриптов

Вы можете подписать скрипты, которые вы пишете, и скрипты, полученные из других источников. Прежде чем подписывать любой скрипт, проверьте каждую команду, чтобы убедиться, что она безопасна для выполнения.

Рекомендации по подписи кода см. в разделе Рекомендации по подписываву кода.

Дополнительные сведения о том, как подписать файл скрипта, см. в разделе Set-AuthenticodeSignature.

Командлет New-SelfSignedCertificate , представленный в модуле PKI в PowerShell 3.0, создает самозаверяющий сертификат, подходящий для тестирования. Дополнительные сведения см. в разделе справки по командлету New-SelfSignedCertificate .

Чтобы добавить цифровую подпись в скрипт, необходимо подписать ее с помощью сертификата подписи кода. Для подписывания файла скрипта подходят два типа сертификатов:

  • Сертификаты, созданные центром сертификации. За дополнительную плату общедоступный центр сертификации проверяет вашу личность и предоставляет сертификат подписи кода. При покупке сертификата в авторитетном центре сертификации вы можете поделиться своим сценарием с пользователями на других компьютерах под управлением Windows, так как эти другие компьютеры доверяют центру сертификации.

  • Создаваемые сертификаты. Вы можете создать самозаверяющий сертификат, для которого компьютер является центром, создающим сертификат. Этот сертификат предоставляется бесплатно и позволяет писать, подписывать и запускать скрипты на компьютере. Однако скрипт, подписанный самозаверяющий сертификат, не будет выполняться на других компьютерах.

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

Если вы создаете самозаверяющий сертификат, обязательно включите надежную защиту закрытого ключа для сертификата. Это не позволяет вредоносным программам подписывать сценарии от вашего имени. Инструкции приведены в конце этой статьи.

Создание самозаверяющего сертификата.

Чтобы создать самозаверяющий сертификат, используйте командлет New-SelfSignedCertificate в модуле PKI. Этот модуль представлен в PowerShell 3.0. Дополнительные сведения см. в разделе справки по командлету New-SelfSignedCertificate .

$params = @{
    Subject = 'CN=PowerShell Code Signing Cert'
    Type = 'CodeSigning'
    CertStoreLocation = 'Cert:\CurrentUser\My'
    HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params

Использование Makecert.exe

Чтобы создать самозаверяющий сертификат в более ранних версиях Windows, используйте средство MakeCert.exeсоздания сертификатов . Это средство входит в пакет SDK microsoft .NET (версии 1.1 и более поздние) и в Microsoft Windows SDK.

Дополнительные сведения о синтаксисе и описаниях параметров средства см. в MakeCert.exe разделе Средство создания сертификатов (MakeCert.exe).

Чтобы использовать MakeCert.exe средство для создания сертификата, выполните следующие команды в окне командной строки пакета SDK.

Примечание

Первая команда создает локальный центр сертификации для компьютера. Вторая команда создает личный сертификат из центра сертификации. Вы можете скопировать или ввести команды точно так, как они отображаются. Подстановка не требуется, хотя имя сертификата можно изменить.

makecert -n "CN=PowerShell Local Certificate Root" -a sha256 `
-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 sha256 `
-eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

Средство MakeCert.exe запрашивает пароль закрытого ключа. Пароль гарантирует, что никто не сможет использовать сертификат или получить доступ к сертификату без вашего согласия. Create и введите пароль, который можно запомнить. Этот пароль будет использоваться позже для получения сертификата.

Чтобы убедиться, что сертификат создан правильно, используйте следующую команду, чтобы получить сертификат в хранилище сертификатов на компьютере. Файл сертификата не будет находиться в каталоге файловой системы.

В командной строке PowerShell введите следующее:

Get-ChildItem cert:\CurrentUser\my -codesigning

Эта команда использует поставщик сертификатов PowerShell для просмотра сведений о сертификате.

Если сертификат был создан, в выходных данных отображается отпечаток , который идентифицирует сертификат на дисплее, похожем на следующее:

Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

Thumbprint                                Subject
----------                                -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF  CN=PowerShell User ]

Подпись скрипта

После создания самозаверяющего сертификата можно подписывать скрипты. Если вы используете политику выполнения AllSigned , подписывание скрипта позволяет запускать скрипт на компьютере.

Следующий пример скрипта Add-Signature.ps1подписывает скрипт. Однако если вы используете политику выполнения AllSigned , перед запуском скрипта Add-Signature.ps1 необходимо подписать.

Важно!

До версии PowerShell 7.2 скрипт должен быть сохранен с использованием кодировки ASCII или UTF8NoBOM. PowerShell 7.2 и более поздних версий поддерживает подписанные скрипты для любого формата кодирования.

Чтобы использовать этот скрипт, скопируйте следующий текст в текстовый файл и назовите его Add-Signature.ps1.

## Signs a file
[cmdletbinding()]
param(
    [Parameter(Mandatory=$true)]
    [string] $File
)

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature -FilePath $File -Certificate $cert

Чтобы подписать файл скрипта Add-Signature.ps1 , введите в командной строке PowerShell следующие команды:

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature add-signature.ps1 $cert

После подписания скрипта его можно запустить на локальном компьютере. Однако скрипт не будет выполняться на компьютерах, где политика выполнения PowerShell требует цифровой подписи от доверенного центра. При попытке PowerShell отобразит следующее сообщение об ошибке:

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

Если powerShell отображает это сообщение при выполнении скрипта, который вы не написали, обрабатывайте файл так же, как любой неподписанный скрипт. Просмотрите код, чтобы определить, можно ли доверять скрипту.

Включение надежной защиты для закрытого ключа

Если на компьютере есть закрытый ключ и сертификат, вредоносные программы могут подписывать сценарии от вашего имени, что разрешает PowerShell выполнять их.

Чтобы предотвратить автоматическое подписывание от вашего имени, экспортируйте ключ подписывания и сертификат в файл с помощью диспетчера Certmgr.exe сертификатов .pfx . Диспетчер сертификатов входит в пакет SDK Для Microsoft .NET, Microsoft Windows SDK и интернет-Обозреватель.

Чтобы экспортировать сертификат, выполните следующие действия.

  1. Запустите диспетчер сертификатов.
  2. Выберите сертификат, выданный корневым локальным сертификатом PowerShell.
  3. Нажмите кнопку Экспорт , чтобы запустить мастер экспорта сертификатов.
  4. Выберите Да, экспортировать закрытый ключ, а затем нажмите кнопку Далее.
  5. Выберите Включить строговую защиту.
  6. Введите пароль, а затем введите его еще раз для подтверждения.
  7. Введите имя файла с расширением .pfx .
  8. Нажмите кнопку Готово.

Чтобы повторно импортировать сертификат, выполните следующие действия.

  1. Запустите диспетчер сертификатов.
  2. Нажмите кнопку Импорт , чтобы запустить мастер импорта сертификатов.
  3. Откройте расположение файла, созданного .pfx в процессе экспорта.
  4. На странице Пароль выберите Включить надежную защиту закрытого ключа, а затем введите пароль, назначенный во время экспорта.
  5. Выберите личное хранилище сертификатов.
  6. Нажмите кнопку Готово.

Предотвращение истечения срока действия подписи

Цифровая подпись в скрипте действительна до истечения срока действия сертификата подписи или до тех пор, пока сервер метки времени может проверить, что скрипт был подписан, пока сертификат подписи был действителен.

Так как большинство сертификатов подписи действительны только в течение одного года, использование сервера метки времени гарантирует, что пользователи смогут использовать ваш скрипт в течение многих лет.

См. также раздел