【发布时间】:2018-05-13 13:06:32
【问题描述】:
目标:我想针对目标计算机运行我的自定义 powershell 脚本,这些脚本使用有效证书进行签名,其 powershell 执行策略设置为“AllSigned”,而无需在目标上安装另一个证书机器。
问题:直到我在目标机器上安装了我用来签署脚本的证书的公钥作为受信任的发布者(我们称之为 MyCert.cer),powershell 脚本才会运行。
可能的误解:我可能误解了代码签名处理上述“问题”的方式。但是我的印象是,由于 Windows 附带默认安装为“受信任的根证书颁发机构”的 DigiCert 证书(见下图),因此我的签名脚本工作所需的只是从数字证书颁发机构对其进行签名。
我的证书详情:
最后的想法:我使用 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