You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建Authenticode签名基础设施以实现组织内PowerShell脚本的可信签名?

如何创建Authenticode签名基础设施以实现组织内PowerShell脚本的可信签名?

看起来你已经把核心框架捋得很清楚了,但可能在几个细节环节没踩对,导致签名后的脚本还是不被信任。我结合组织内搭建这类基础设施的实际经验,帮你把流程补全,再解答你遇到的问题:

一、你规划的核心流程(已验证可行的基础框架)

  • 部署Windows证书服务(CA)服务器,创建根CA证书(RootCA.cer)
  • 在CA服务器上配置代码签名证书模板:这里要注意模板必须启用「代码签名」的增强密钥用法(EKU),同时设置好权限——只允许指定的用户/组申请这类证书,避免滥用
  • 通过组策略将RootCA.cer部署到所有客户端的两个关键存储:
    • 受信任的根证书颁发机构:确保客户端认可根CA的合法性
    • 受信任的发布者:这是让根CA签发的所有代码签名证书被视为可信的关键步骤
  • 授权用户通过该模板申请代码签名证书(CodeSigningCert),由根CA签发后导入用户的个人证书存储

二、你遇到的问题:为什么用这个证书签名脚本后仍不被信任?

你提到「代码签名证书是根CA的委托,应该因为根CA在可信发布者存储就被认可」,这里有个常见误区:

仅仅把根CA放到受信任的根证书颁发机构,只能让客户端信任证书的合法性,但要让代码签名证书被PowerShell视为「可信发布者」,需要满足三个条件:

  1. 根CA证书确实被部署到了客户端的受信任的发布者存储(而不只是根存储)
  2. 代码签名证书的EKU必须包含「代码签名」(标识符为1.3.6.1.5.5.7.3.3),否则PowerShell会拒绝认可它的签名权限
  3. 用户拿到的必须是带私钥的PFX格式证书,而不是只有公钥的CER文件——签名脚本必须用到私钥,单纯的CER根本无法完成签名操作

三、补充完整的脚本签名与验证步骤

  1. 用户将签发的PFX格式代码签名证书导入自己的个人证书存储(当前用户或本地机器存储均可)
  2. 使用PowerShell命令签名脚本:
# 查找当前用户存储里的代码签名证书
$cert = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert
# 给目标脚本添加Authenticode签名
Set-AuthenticodeSignature -FilePath "C:\Scripts\MyDeployScript.ps1" -Certificate $cert
  1. 在客户端验证签名有效性:
Get-AuthenticodeSignature -FilePath "C:\Scripts\MyDeployScript.ps1"

如果输出结果里的Status字段显示Valid,说明签名已被信任;如果是UnknownError或NotTrusted,优先检查根CA的部署情况和证书的EKU配置。

四、额外的最佳实践

  • 给代码签名证书设置合理的有效期,定期轮换,避免证书泄露带来的风险
  • 通过组策略严格限制代码签名证书的申请权限,只开放给需要部署脚本的授权人员
  • 在CA服务器上开启证书审核功能,跟踪所有代码签名证书的申请和使用记录

备注:内容来源于stack exchange,提问作者Hugo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:48:20