Як легко підписати скрипт PowerShell?


15

Я вважаю за краще використовувати політику виконання AllSigned із PowerShell, але для самопідписання моїх сценаріїв потрібне завантаження та встановлення кількох сотень мегабайт, і процес підписання здається клопотом.

Чи є простіший спосіб підписати скрипт PowerShell, ніж описано в документації?

Відповіді:


7

Для підписання ви можете використовувати Set-AuthenticodeSignatureкомандлет. Для цього, звичайно, потрібен сертифікат. Якщо у вас є орган сертифікації (навряд чи), який зможе створити сертифікат підписання коду. В іншому випадку є різні інструменти для створення сертифіката, який підписав самостійно.

Ви встановлюєте сертифікат у своєму магазині сертифікатів (для цього відкрийте файл .cerабо .pfxв Windows Explorer), а потім передаєте його Set-AuthenticodeSignature( cert:постачальник / диск надає доступ до сертифікатів у вашому магазині).

Використовуйте

help about_signing

або онлайнову версію цієї довідкової теми для отримання детальної інформації (включаючи створення сертифіката, що підписується самостійно, за допомогою інструментів Windows SDK [1] ).

[1] Я припускаю, що це велике завантаження, на яке ви посилаєтесь: ви можете просто встановити потрібні біти або скористатися іншими інструментами (OpenSSL включає генерацію сертифікатів). Отримати SDK для цієї мети є разовою діяльністю.


Я приймаю цю відповідь і припускаю, що немає ярлика і підписання просто потрібно зробити, як було зазначено в документах.
Віль Коскінен

1
Як і чимало речей, що розробляються та розробляються, важко, але реальна практика (особливо якщо це робиться регулярно) - це не так.
Річард

7

Я використовую цей сценарій 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`""
}

5

Отримавши сертифікат, я хотів використати імпортований на свій обліковий запис користувача. Цей реєк дав мені опцію " Увійти" у контекстному меню (я використовую Windows 7). Якщо сертифікат, з яким ви хочете підписатись, зберігається інакше, просто змініть команду PowerShell в кінці.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1]

[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell]

[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell\Sign]

[HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell\Sign\Command]
@="C:\\\Windows\\\System32\\\WindowsPowerShell\\\v1.0\\\powershell.exe -command Set-AuthenticodeSignature '%1' @(Get-ChildItem cert:\\\CurrentUser\\\My -codesigning)[0]"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.