如何轻松签署PowerShell脚本?


15

我更喜欢在PowerShell中使用AllSigned执行策略,但是自签名我的脚本似乎需要下载和安装数百兆字节,并且签名过程似乎很麻烦。

有没有一种比文档中描述的更简单的方法来签名PowerShell脚本?

Answers:


7

要执行签名,您可以使用Set-AuthenticodeSignaturecmdlet。当然,这需要证书。如果您拥有(不太可能)有一个证书颁发机构,它将能够创建代码签名证书。否则,有各种工具可以创建自签名证书。

您将证书安装在证书存储中(在Windows资源管理器中打开.cer.pfx文件来执行此操作),然后将其传递给Set-AuthenticodeSignaturecert:提供者/驱动器可以访问您存储中的证书)。

采用

help about_signing

或该帮助主题的在线版本以获取详细信息(包括使用Windows SDK工具[1]创建自签名证书)。

[1]我认为这是您要下载的大量内容:您可以只安装所需的位,或使用其他工具(OpenSSL包括证书生成)。为此,获取SDK是一次性的活动。


我接受此答案,并假设没有捷径,仅需按照文档中的说明进行签名。
Ville Koskinen 2010年

1
像很多“开发人员”一样,最初的设置和学习很困难,但实际的实践(尤其是定期进行)并不困难。
理查德2010年

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

获得证书后,我想在用户帐户上使用导入。此regkey 在上下文菜单中为我提供了一个选项Sign(我正在使用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]"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.