Я предпочел бы использовать политику казни AllSigned с PowerShell, но самоподписать мои сценарии, кажется, требует нескольких сотен мегабайтов загрузки и установки, и процесс подписания, кажется, стычка.
Существует ли более простой способ подписать сценарий PowerShell, чем описанный в документации?
Чтобы сделать подписание Вас может использовать Set-AuthenticodeSignature
cmdlet. Это, конечно, требует сертификата. Если у Вас есть Центр сертификации (вряд ли), который сможет создать сертификат для подписывания кода. Иначе существуют различные инструменты для создания самоподписанного сертификата.
Вы устанавливаете сертификат в своем хранилище сертификатов (откройтесь .cer
или .pfx
файл в Windows Explorer, чтобы сделать это), и затем передают его Set-AuthenticodeSignature
( cert:
поставщик/диск предоставляет доступ к сертификатам в Вашем хранилище).
Использовать
help about_signing
или интерактивная версия той темы справки для деталей (включая создание самоподписанного сертификата с помощью инструментов Windows SDK [1]).
[1] Я предполагаю, что это - большая загрузка, к которой Вы обращаетесь: можно просто установить биты, в которых Вы нуждаетесь или используете другие инструменты (OpenSSL включает поколение сертификата). Получение SDK является, с этой целью, одноразовым действием.
Я использую этот сценарий PowerShell:
## sign-script.ps1
## Sign a powershell script with a Thawte certificate and
## timestamp the signature
##
## usage: ./sign-script.ps1 c:\foo.ps1
param([string] $file=$(throw “Please specify a script filepath.”))
$certFriendlyName = "Thawte Code Signing"
$cert = gci cert:\CurrentUser\My -codesigning | where -Filter
{$_.FriendlyName -eq $certFriendlyName}
# https://www.thawte.com/ssl-digital-certificates/technical-
# support/code/msauth.html#timestampau
# We thank VeriSign for allowing public use of their timestamping server.
# Add the following to the signcode command line:
# -t http://timestamp.verisign.com/scripts/timstamp.dll
$timeStampURL = "http://timestamp.verisign.com/scripts/timstamp.dll"
if($cert) {
Set-AuthenticodeSignature -filepath $file -cert $cert -IncludeChain All -
TimeStampServer $timeStampURL
}
else {
throw "Did not find certificate with friendly name of `"$certFriendlyName`""
}