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 и включен в Windows 8 и Windows Server 2012. Дополнительные сведения см. в разделе справки для командлета 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 запросит пароль закрытого ключа. Пароль гарантирует, что никто не сможет использовать или получить доступ к сертификату без вашего согласия. Создайте и введите пароль, который можно запомнить. Этот пароль будет использоваться позже для получения сертификата.

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

В командной строке 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
param([string] $file=$(throw "Please specify a filename."))
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature $file $cert

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

$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
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 и Internet Explorer.

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

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

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

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

Запретить истечение срока действия подписи

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

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

См. также