运行 目标机器上的 CodeSigned powershell 脚本

Running CodeSigned powershell scripts on target machines

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

问题: 在我安装证书的 public 密钥之前,Powershell 脚本不会 运行 我作为受信任的发布者对脚本进行签名(我们称之为 MyCert.cer)在目标机器上。

可能的误解: 我可能误解了代码签名处理上述“问题”的方式。然而,我的印象是,由于 windows 默认安装了 DigiCert 证书作为“受信任的根证书颁发机构”(见下图),我签名的脚本工作所需的只是从数字证书颁发机构签署它们.

我的证书详细信息:

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

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

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

我想让大家知道我确实为 includeChain 添加了 "All"。我还尝试将 digiCerts 时间戳服务器用于 -TimestampServer 参数。但是,添加时间戳不会对 运行 脚本产生影响。根据我的理解,-TimestampServer 参数用于证书何时过期并需要重新验证。但是我使用的证书仍然是最新的并且没有过期。

您正在寻找 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

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