如何关联Windows证书签名算法与SignTool参数并解决签名报错
ClickOnce签名脚本更新问题排查
核心参数对应关系
先明确SignTool两个易混参数的作用,和查到的证书属性对应如下:
/fd:指定生成文件签名时使用的摘要哈希算法,对应证书详情里看到的签名哈希算法项,当前填的sha384是匹配的,不需要改。/td:指定请求RFC3161时间戳时,时间戳服务返回签名使用的哈希算法,这个不属于证书本身的属性,和证书签名哈希算法保持一致填sha384即可,当前参数值配置正确。- 看到的指纹算法是系统计算证书指纹(证书唯一标识)用的哈希规则,仅在通过指纹指定证书时作为标识的计算规则使用,不属于签名流程的算法配置项,单证书场景不需要单独为它配置参数。
报错根因
当前执行命令报的##[错误]SignTool 错误:未找到满足所有给定条件的证书,核心原因是命令里没有明确指定要使用的签名证书:
现有命令里的$hash变量未做有效赋值,SignTool在没有明确指定证书的情况下,会自动在证书存储里匹配满足「有代码签名用途、私钥可访问、主题与被签名文件匹配」的证书,匹配不到就会抛出这个错误。
修复步骤
- 打开证书管理器,找到导入的新签名证书,在详情页找到「指纹」字段,复制其中的十六进制字符串,删掉所有空格和开头可能带有的不可见特殊字符,存为变量:
$certThumbprint = "粘贴你处理完的证书指纹字符串" - 修改签名命令,加上
/sha1参数通过指纹明确指定要使用的证书,删掉无效的$hash变量,修正后的命令如下:Get-AuthenticodeSignature *.exe,*.dll | Where-Object Status -eq NotSigned | ForEach-Object Path | ForEach-Object { & $signtool sign /sha1 $certThumbprint /tr $timestamp /td sha384 /fd sha384 $_ } - 执行前做以下检查避免其他报错:
- 确认导入证书时勾选了「允许导出私钥」/将私钥一并导入,当前运行脚本的账号对该证书的私钥有读取权限(可在证书右键菜单→所有任务→管理私钥中配置权限)
- 确认证书存放在「当前用户\个人」或「本地计算机\个人」存储路径下,证书在有效期内,增强型密钥用法包含「代码签名」项
- 确认使用的SignTool来自Windows 10及以上版本的SDK,老版本SignTool不支持SHA384签名算法
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

