Bir PowerShell betiğini kolayca nasıl imzalayabilirim?


15

PowerShell ile AllSigned yürütme ilkesini kullanmayı tercih ederim, ancak komut dosyalarımı otomatik olarak imzalamak yüzlerce megabayt indirme ve yükleme gerektiriyor ve imzalama işlemi bir güçlük gibi görünüyor.

PowerShell betiğini imzalamak için belgelerde açıklanandan daha basit bir yol var mı?

Yanıtlar:


7

İmzayı yapmak için Set-AuthenticodeSignaturecmdlet'i kullanabilirsiniz . Bu elbette bir sertifika gerektirir. Kod imzalama sertifikası oluşturabilecek bir Sertifika Yetkiliniz (olası değil) varsa. Aksi takdirde, kendinden imzalı bir sertifika oluşturmak için çeşitli araçlar vardır.

Sertifikayı sertifika deponuza yüklersiniz ( bunu yapmak için Windows Gezgini'nde .cerveya .pfxdosyayı açın ) ve ardından iletin Set-AuthenticodeSignature( cert:sağlayıcı / sürücü mağazanızdaki sertifikalara erişim sağlar).

kullanım

help about_signing

veya ayrıntılar için bu yardım konusunun çevrimiçi sürümü (Windows SDK araçlarını [1] kullanarak kendinden imzalı bir sertifika oluşturma dahil ).

[1] Bunun bahsettiğiniz büyük indirme olduğunu varsayıyorum: sadece ihtiyacınız olan bitleri yükleyebilir veya diğer araçları kullanabilirsiniz (OpenSSL, sertifika oluşturmayı içerir). SDK'yı elde etmek, bu amaçla bir defalık bir faaliyettir.


Bu yanıtı kabul ediyorum ve herhangi bir kısayol olmadığını ve imzalamanın dokümanlarda belirtildiği gibi yapılması gerektiğini varsayıyorum.
Ville Koskinen

1
Oldukça az sayıda "geliştirici-y" gibi, ilk kurulum ve öğrenme zordur, ancak asıl uygulama (özellikle düzenli olarak yapılıyorsa) değildir.
Richard

7

Bu PowerShell betiğini kullanıyorum:

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

Sertifikayı aldıktan sonra, kullanıcı hesabımda içe aktarılmış kullanmak istedim. Bu regkey , bağlam menüsünde bana bir seçenek verdi, Sign (Windows 7 kullanıyorum). İmzalamak istediğiniz sertifika farklı şekilde depolanıyorsa , sonunda PowerShell komutunu değiştirmeniz yeterlidir .

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]"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.