Bagaimana cara menandatangani skrip PowerShell dengan mudah?

15

Saya lebih suka menggunakan kebijakan eksekusi AllSigned dengan PowerShell, tetapi menandatangani sendiri skrip saya tampaknya memerlukan beberapa ratus megabyte pengunduhan dan pemasangan dan proses penandatanganan tampaknya merepotkan.

Apakah ada cara yang lebih sederhana untuk menandatangani skrip PowerShell daripada yang dijelaskan dalam dokumentasi?

Ville Koskinen
sumber

Jawaban:

7

Untuk melakukan penandatanganan Anda dapat menggunakan Set-AuthenticodeSignaturecmdlet. Ini, tentu saja, membutuhkan sertifikat. Jika Anda memiliki Otoritas Sertifikat (tidak mungkin) yang akan dapat membuat sertifikat penandatanganan kode. Kalau tidak, ada berbagai alat untuk membuat sertifikat yang ditandatangani sendiri.

Anda menginstal sertifikat di toko sertifikat Anda (membuka .ceratau .pfxfile dalam Windows Explorer untuk melakukan hal ini), dan kemudian menyebarkannya ke Set-AuthenticodeSignature(pada cert:penyedia / drive memberikan akses ke sertifikat di toko Anda).

Menggunakan

help about_signing

atau versi online dari topik bantuan itu untuk detail (termasuk membuat sertifikat yang ditandatangani sendiri menggunakan alat Windows SDK [1] ).

[1] Saya menganggap ini adalah unduhan besar yang Anda maksud: Anda hanya dapat menginstal bit yang Anda butuhkan, atau menggunakan alat lain (OpenSSL termasuk pembuatan sertifikat). Mendapatkan SDK adalah, untuk tujuan ini, aktivitas sekali saja.

Richard
sumber
Saya menerima jawaban ini dan berasumsi bahwa tidak ada jalan pintas dan penandatanganan hanya perlu dilakukan seperti yang disebutkan dalam dokumen.
Ville Koskinen
1
Seperti beberapa hal "pengembang-y", pengaturan awal dan pembelajaran sulit, tetapi praktik sebenarnya (terutama jika dilakukan secara teratur) tidak.
Richard
7

Saya menggunakan skrip PowerShell ini:

## 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`""
}
Awal
sumber
5

Setelah saya memiliki sertifikat, saya ingin menggunakan yang diimpor pada akun pengguna saya. Regkey ini memberi saya opsi, Masuk , dalam menu konteks (Saya menggunakan Windows 7). Jika sertifikat yang ingin Anda tanda tangani disimpan secara berbeda, cukup ubah perintah PowerShell di bagian akhir.

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]"
Fawr
sumber