如何创建 Authenticode 签名基础设施?

如何创建 Authenticode 签名基础设施?

我正在尝试创建必要的基础架构,以允许授权用户签署 PowerShell 脚本并让组织信任它们,这允许使用 AllSigned 执行策略将脚本部署到计算机。这是我设想的过程:

  • Windows 证书颁发机构服务服务器创建 RootCA(RootCA.cer)。
  • 该服务器内有一个代码签名证书的证书模板。
  • RootCA 通过组策略部署到所有计算机,并放入受信任的发布者存储中。
  • 用户使用模板(CodeSigningCert.cer)请求代码签名证书,该证书由 RootCA 签名和验证。

此时,代码签名证书(CodeSigningCert.cer)是 RootCA(RootCA.cer)的代表,并且根据我的假设,它应该有资格成为受信任的发布者,因为它的父证书(RootCA.cer)位于受信任的发布者存储中。

但是,如果我使用此证书对 PowerShell 脚本进行签名:

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert
Set-AuthenticodeSignature -FilePath "Z:\PowerShellTest.ps1" -Certificate $cert

然后尝试运行它,我收到:

Do you want to run software from this untrusted publisher?

相比之下,如果我手动将 CodeSigningCert.cer 本身添加到受信任的发布者存储区,那么 Windows 就会愉快地运行 PowerShell 脚本,因为它是受信任的。

请告诉我:

  • 我是否错误地认为这就是 AuthenticodeSignature 签名链的工作方式?(只需要信任父母,委托人就可以签署脚本)
  • 如果我错了,作为一个组织,签署 PowerShell 脚本的最佳方式是什么?
  • 如果我是不是错了,我做错了什么?

Authenticode签名图

感谢您提供的任何帮助。

答案1

您并没有真正弄错,只是不知道所有细节。简而言之,.NET 中的代码签名信任分为 4 个级别:

  1. 不受信任。签名是由明确不受信任的发布者创建的。当证书持有者丢失自己的签名私钥或私钥被盗时,签名证书通常会被吊销。为了避免证书丢失(因此没有人能够使用被盗证书冒充合法用户并创建恶意签名),必须吊销证书和/或将其放入 Windows 本地证书存储中的不受信任证书容器中。
  2. 未知出版商。身份未知,签名无效。由于没有经过验证的签名,因此无法确定身份。签名证书未被撤销或明确不受信任,而是由不受信任的证书颁发机构 (CA) 颁发的。
  3. 知名出版商。身份已知且签名有效。有效的 Authenticode 签名可提供身份。签名证书是由受信任的 CA 颁发的有效证书。
  4. 值得信赖的发布者。签名有效,由明确受信任的发布者创建。此信任级别的签名证书必须由任何受信任的 CA 颁发,并且证书必须放置在受信任的发布者本地证书存储中。

PowerShell 的执行策略要求值得信赖的发布者信任级别。这意味着,除了根 CA 证书之外,您还必须将确切的代码签名证书分发到客户端的受信任发布者证书容器。您可以使用组策略执行此操作。

附言:我建议在签名期间使用时间戳。这样即使在代码签名证书过期后也可以运行签名的脚本。更多详细信息请参阅我的博客文章:https://www.sysadmins.lv/blog-en/digital-signatures.aspx

相关内容