Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Краткое описание
Описывает, как подписывать скрипты, чтобы они соответствовали политикам выполнения PowerShell.
Длинное описание
Эта информация относится только к PowerShell, работающей в Windows.
Политика ограниченного выполнения не позволяет запускать никакие скрипты. Политики выполнения AllSigned и RemoteSigned не позволяют PowerShell запускать скрипты, которые не имеют цифровой подписи.
В этом разделе объясняется, как запускать выбранные скрипты, которые не подписаны, даже если политика выполнения RemoteSigned, и как подписывать скрипты для собственного использования.
PowerShell проверяет сигнатуру Authenticode следующих типов:
- файлы скриптов
.ps1 - файлы модулей
.psm1 -
.psd1манифест модуля и файлы данных -
.ps1xmlтип и форматирование XML-файлов -
.cdxmlфайлы скриптов CDXML -
.xamlфайлы скриптов XAML
Дополнительные сведения о политиках выполнения PowerShell см. в about_Execution_Policies.
Разрешение выполнения подписанных скриптов
При первом запуске PowerShell на компьютере, политика выполнения ограниченного, которая по умолчанию, скорее всего, будет в действии.
Ограничивающая политика запрещает выполнение всех скриптов.
Чтобы найти эффективную политику выполнения на компьютере, введите следующее:
Get-ExecutionPolicy
Политика RemoteSigned позволяет запускать подписанные скрипты или неподписанные скрипты, создаваемые локально. Чтобы настроить эту политику, запустите PowerShell с параметром запуска от имени администратора, а затем выполните следующую команду, чтобы изменить политику выполнения.
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 или выполните следующую процедуру.
- Сохраните файл скрипта на компьютере.
- Щелкните Пуск, щелкните "Мой компьютер" и найдите сохраненный файл скрипта.
- Щелкните правой кнопкой мыши по файлу скрипта и выберите Свойства.
- Щелкните Разблокируйте.
Если скрипт, скачанный из Интернета, имеет цифровую подпись, но вы еще не решили доверять издателю, 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 и более поздние версии) и в пакет SDK для Microsoft Windows.
Дополнительные сведения о синтаксисе и описаниях параметров средства 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
[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
Командлет Set-AuthenticodeSignature добавляет подпись в файл скрипта в качестве блока комментариев в конце файла. Блок комментариев начинается и заканчивается с # SIG #.
После подписания скрипта его можно запустить на локальном компьютере. Однако скрипт не будет выполняться на компьютерах, где политика выполнения 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, пакет SDK Для Microsoft Windows и Internet Explorer.
Чтобы экспортировать сертификат, выполните следующие действия.
- Запустите диспетчер сертификатов.
- Выберите сертификат, выданный Локальным корневым центром сертификации PowerShell.
- Щелкните Экспортировать, чтобы запустить мастер экспорта сертификатов.
- Выберите Да, экспортируйте закрытый ключ, а затем нажмите кнопку Далее.
- Выберите Включить надежную защиту.
- Введите пароль и введите его еще раз, чтобы подтвердить.
- Введите имя файла с расширением имени файла
.pfx. - Нажмите кнопку Завершить.
Чтобы повторно импортировать сертификат, выполните следующие действия.
- Запустите диспетчер сертификатов.
- Щелкните Импорт, чтобы запустить мастер импорта сертификатов.
- Откройте расположение файла
.pfx, созданного во время процесса экспорта. - На странице "Пароль" выберите Включить защиту надежных закрытых ключей, а затем введите пароль, назначенный во время экспорта.
- Выберите хранилище сертификатов Персональный.
- Нажмите кнопку Завершить.
Запрет истечения срока действия подписи
Цифровая подпись в скрипте действительна до истечения срока действия сертификата подписи или до тех пор, пока сервер метки времени может убедиться, что скрипт подписан, пока сертификат подписи действителен.
Так как большинство сертификатов подписывания действительны только в течение одного года, использование сервера меток времени гарантирует, что пользователи могут использовать скрипт в течение многих лет.
См. также
PowerShell