【问题标题】:Running CodeSigned powershell scripts on target machines在目标机器上运行 CodeSigned PowerShell 脚本
【发布时间】:2018-05-13 13:06:32
【问题描述】:

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

问题:直到我在目标机器上安装了我用来签署脚本的证书的公钥作为受信任的发布者(我们称之为 MyCert.cer),powershell 脚本才会运行。

可能的误解:我可能误解了代码签名处理上述“问题”的方式。但是我的印象是,由于 Windows 附带默认安装为“受信任的根证书颁发机构”的 DigiCert 证书(见下图),因此我的签名脚本工作所需的只是从数字证书颁发机构对其进行签名。

我的证书详情:

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

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

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

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

我想让每个人都知道我确实为 includeChain 包含了“全部”。我还尝试将 digiCerts 时间戳服务器用于 -TimestampServer 参数。但是,添加时间戳对运行脚本没有影响。据我了解, -TimestampServer 参数用于证书何时过期并需要重新验证。但是我使用的证书仍然是最新的并且没有过期。

【问题讨论】:

  • 我没有任何运行由公共证书签名的脚本的经验,但我确实有一些签名脚本的经验。在域中,我可以运行使用我的证书(由内部 CA 颁发)签名的脚本。在技​​术方面没有太大的区别。在签署脚本时,我确实必须使用 -Timestamp 参数。请参阅docs.microsoft.com/en-us/powershell/module/… 了解更多信息。根据文档 -IncludeChain 也应该可以工作。
  • 感谢您的反馈。我使用 DigiCerts 时间戳服务器退出了我的脚本,并且还为证书链包含了“全部”。但是,这两者对于运行脚本都没有影响。在查看您链接到的文档后,似乎 -Timestamp 参数仅适用于证书过期时。这是同一文档的引用:“如果证书过期,时间戳可防止脚本失败”但是我的证书仍然有效......

标签: windows powershell certificate code-signing


【解决方案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 证书是一件非常好的事情。 p>

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2014-07-26
    • 2022-10-14
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多