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

CI/CD中使用DigiCert CRT证书代码签名失败求助

DigiCert CRT证书CI/CD流水线代码签名解决方案

问题根源

本地手动能完成签名但流水线执行失败,核心差异在于:本地环境会自动加载证书链和USB令牌,而流水线是无交互的干净环境,必须显式配置证书路径、链文件及令牌访问参数,同时要解决权限与证书链验证问题。

可用PowerShell签名脚本&语法

1. 基于本地计算机证书存储的签名(推荐)

先将DigiCert提供的3个证书(根证书、中间证书、用户CRT)导入流水线节点的本地计算机证书存储(优先选择此存储,避免用户存储的权限限制),再执行以下命令:

# 先在本地环境获取证书主题名或指纹,拿到流水线中复用
Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.EnhancedKeyUsageList -match "Code Signing"} | Select-Object Subject, Thumbprint

# 核心签名命令
& signtool sign /v /sm /n "你的证书主题名称" /ac "DigiCert中间证书路径.crt" /tr "http://timestamp.digicert.com" /td SHA256 /fd SHA256 "待签名文件.exe"

参数说明:

  • /sm:指定使用本地计算机证书存储,规避用户存储的权限问题
  • /n:通过证书主题名定位目标证书(也可替换为/sha1 证书指纹,定位更精准)
  • /ac:附加中间证书文件,确保完整的证书链,解决签名后的证书验证失败问题
  • /tr+/td:调用DigiCert的RFC 3161时间戳服务,避免证书过期后签名失效

2. 结合USB令牌的签名(私钥存储在令牌中时)

如果代码签名的私钥存储在DigiCert提供的USB令牌中,先在流水线节点安装令牌驱动,再执行以下命令:

# 先在本地环境获取令牌的密钥容器名,拿到流水线中复用
certutil -scinfo

# 核心签名命令
& signtool sign /v /csp "DigiCert Key Storage Provider" /kc "令牌密钥容器名" /ac "中间证书路径.crt" /tr "http://timestamp.digicert.com" /td SHA256 /fd SHA256 "待签名文件.exe"

参数说明:

  • /csp:指定DigiCert USB令牌对应的加密服务提供者
  • /kc:指定令牌内的密钥容器名称,精准定位私钥

流水线必备配置

  • 安装最新版SignTool:需从Windows 10/11 SDK中获取,旧版本不支持/tr等时间戳相关参数
  • 导入证书链:将DigiCert提供的3个证书分别导入本地计算机的「受信任的根证书颁发机构」和「中间证书颁发机构」存储
  • 令牌访问配置:若为物理USB令牌,流水线节点需支持USB直通功能且已安装对应驱动;若为云令牌,需配置官方客户端
  • 权限配置:确保执行PowerShell脚本的账号拥有访问证书存储和USB令牌的权限

快速排查技巧

  • 在流水线节点手动执行签名命令,排除脚本语法问题
  • 执行certutil -store LocalMachine\My,确认目标证书存在且带有私钥标记(显示Key Container字段)
  • 执行signtool /?,检查版本是否支持/tr等参数

内容的提问来源于stack exchange,提问作者Sabitha Vemu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:35:14