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

Azure DevOps经典发布流水线中DigiCert smctl签名失败问题

DigiCert smctl签名在Azure经典发布流水线失败的排查解决

问题背景

在Azure YAML流水线中,使用DigiCert Signing Manager Controller (smctl)可正常完成安装程序签名,任务配置如下:

- task: CmdLine@2
  displayName: 'Sign setup file'
  inputs:
    script: 
      smctl sign --verbose --keypair-alias=$(digicert-key-pair-alias) --certificate=$(Agent.TempDirectory)\KeyCert.pem  --config-file $(SSMClientToolsSetup.PKCS11_CONFIG) --input $(System.ArtifactsDirectory)
  env:
    SM_HOST: $(CodeSigningHost)
    SM_API_KEY: $(digicert-api-key)
    SM_CLIENT_CERT_PASSWORD: $(digicert-cert-pw)
    SM_CLIENT_CERT_FILE: $(caCertificate.secureFilePath)

但将该任务原封不动迁移至Azure DevOps经典发布流水线后,出现签名失败错误:

Command : 
 signtool sign  /tr http://timestamp.digicert.com /td SHA256  /fd  SHA256   /csp "DigiCert Signing Manager KSP" /kc "***" /f "D:\a\_temp\KeyCert.pem"  "D:\a\1\a\setup\ApplicationService_Setup_4.2.0.57.exe" 
Error : 
Done Adding Additional Store
Error information: "Error: SignerSign() failed." (-2146893779/0x8009002d)
 
 exit status 1: SignTool Error: An unexpected internal error has occurred.

已确认:DigiCert工具安装正常,证书及环境变量配置完整,两种流水线均有权限访问证书安全文件与密钥变量组。

排查与解决步骤

1. 修正环境变量传递逻辑

经典发布流水线与YAML流水线的环境变量处理逻辑存在差异:

  • 在CmdLine任务的「环境变量」栏手动显式添加所有SM_*开头的环境变量,格式为SM_HOST=$(CodeSigningHost),避免依赖变量组自动传递时的解析问题。
  • 输出$(caCertificate.secureFilePath)变量值确认路径正确性,部分场景下经典流水线对安全文件路径的解析逻辑与YAML不同,必要时可手动指定证书的绝对路径。

2. 调整smctl命令参数

  • 将--input参数指向经典流水线的标准工件路径,比如$(System.DefaultWorkingDirectory)/**/*.exe,避免路径解析错误。
  • 添加--no-sign-tool参数,强制smctl直接使用自身签名逻辑,而非调用系统signtool(报错显示实际调用了signtool,可能是经典环境下默认行为不同)。修改后的命令示例:
smctl sign --verbose --no-sign-tool --keypair-alias=$(digicert-key-pair-alias) --certificate=$(Agent.TempDirectory)\KeyCert.pem --config-file $(SSMClientToolsSetup.PKCS11_CONFIG) --input $(System.DefaultWorkingDirectory)

3. 验证PKCS11配置文件有效性

  • 添加前置CmdLine任务执行type $(SSMClientToolsSetup.PKCS11_CONFIG),确认配置文件存在且内容正确。
  • 检查配置文件中的PKCS11库路径是否适配代理操作系统(比如Windows代理下需使用正确的盘符路径格式)。

4. 统一代理环境与工具版本

  • 确保经典流水线使用的代理与YAML流水线为同一组或同一台机器,避免因代理环境差异导致的工具版本、权限问题。
  • 升级smctl到最新稳定版本,旧版本可能存在经典流水线兼容性缺陷。

内容的提问来源于stack exchange,提问作者Mustafa Alamir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:37:40