在目标计算机上运行CodeSigned powershell脚本

时间:2017-11-29 18:19:27

标签: windows powershell certificate code-signing

目标:我想运行我的自定义PowerShell脚本,这些脚本使用有效证书对目标计算机进行签名,其powershell执行策略设置为“AllSigned”,而无需在目标上安装其他证书机。

问题:在我安装用于将脚本签名为目标计算机上的受信任发布者(我们称之为MyCert.cer)的证书的公钥之前,powershell脚本将不会运行。

可能的误解:我可能会误解代码签名的方式与上面的“问题”有关。但是我的印象是,由于Windows自带的DigiCert证书默认安装为“受信任的根证书颁发机构”(见下图),我签署的脚本工作所需要的只是从digicert权限签名。 Screenshot of TrustedRootCertAuth section of certificates

我的证书详情:

  • 我从DigiCert购买了代码签名证书。证书有效,并且“EKU”为“代码签名(1.3.6.1.5.5.7.3.3)”。
  • 证书链:

    My Certificates cert chain

最后的想法:我使用cmdlet“Set-AuthenticodeSignature”和我发布的代码签名证书签署了powershell脚本。如果我在目标计算机上将MyCert.cer公钥安装为“受信任的发布者”,则将运行脚本。但是,我不想触摸目标计算机,并能够针对所述计算机运行我的代码签名脚本。这可能吗?我是否为我的目标购买了错误的证书?或者是运行代码签名脚本所需的Trusted Publishers证书存储区的条目? 谢谢你的时间。

更新:以下是我用来签署powershell脚本的命令。

Set-AuthenticodeSignature -Certificate $cert -FilePath $FileToSign -IncludeChain all

我想让每个人都知道我确实包含了#34; All"对于includeChain。我也尝试使用digiCerts时间戳服务器作为-TimestampServer参数。但是,添加时间戳对运行脚本没有任何影响。根据我的理解,-TimestampServer参数适用于证书过期并需要重新验证的时间。但是我使用的证书仍然是最新的并且没有过期。

1 个答案:

答案 0 :(得分:1)

您正在查找AllSigned执行政策的预期行为。从Get-Help about_Execution_Policies您会看到:

 AllSigned
 - Scripts can run.

 - Requires that all scripts and configuration files
   be signed by a trusted publisher, including scripts
   that you write on the local computer.

简短的回答是,您需要在所有计算机上信任您的证书(使用组策略的简单方法)。您要编写的组策略对象将修改Computer Configuration\Windows Settings\Security Settings\Public Key Policies\Trusted Publishers,然后您需要按照Certificate Import Wizard中的说明进行操作。这里的关键是证书可以追溯到您组织中的Trusted Root Certification Authorities,因此您购买Digicert证书并且您的组织信任Digicert证书是非常好的

那么为什么Digicert会出现在受信任的根证书颁发机构之下呢?答案很简单。这意味着您的组织会识别Digicert证书并允许它们受信任。这并不意味着每个Digicert证书都会自动获得通过,这只意味着它们允许安装到您的域中。我会选择Comodo,因为它们按字母顺序排列,并且不会显示在屏幕截图中。因为Comodo还提供了数字证书,如果我使用我的Comodo证书签署我的脚本并尝试在您的域中安装该证书,那么由于Comodo不是您域中的Trusted Root Certification Authority,因此它不会成功。

我希望这有助于解释发生了什么!