如何配置证书颁发者为Microsoft测试根证书机构解决signtool验证失败
签名验证失败问题解决方案
错误根因
你看到的报错SignTool Error: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider本质是两个问题叠加:
- 你用
makecert生成的KM_test1是自签名根证书,没有被加入系统受信任的根证书颁发机构存储,系统默认不信任该证书签发的所有内容 - 你执行验证命令时没加
/pa参数,默认走的是内核驱动签名校验策略,对证书链的要求和普通用户态DLL不同
你设想的「将证书颁发者设置为Microsoft Testing Root Certificate Authority 2010」的思路不可行:你没有该微软测试根证书的私钥,根本无法签发出归属该合法证书链的终端签名证书,伪造的证书链会直接被校验逻辑拦截。你手中的correctFile.dll能验证通过,是因为对应的微软测试根证书默认预置在系统受信任根存储中,且证书链是微软官方持私钥签发的合法链。
可行修复方案
根据你的使用场景二选一即可:
方案1:本地/内部测试场景(操作最简)
把你自己生成的自签根证书导入系统受信任存储,验证时加对应参数即可:
- 找到你生成的
KM_test1.cer文件,右键选择「安装证书」 - 存储位置选择本地计算机(需管理员权限),点击下一步
- 选择「将所有证书放入下列存储」,点击浏览选中「受信任的根证书颁发机构」,完成导入
- 重新执行验证命令,必须加
/pa参数指定使用用户态代码签名验证策略:
signtool verify /pa /debug "myfile.dll"
执行后即可通过校验。
方案2:适配项目固定证书链校验逻辑
如果你的项目硬编码校验签名链必须匹配微软测试证书的层级名称,可以本地生成一套同名证书链,再把自生成的根证书导入受信任存储:
- 生成同名自签名根证书,直接放入受信任根存储:
makecert.exe -r -pe -ss Root -n "CN=Microsoft Testing Root Certificate Authority 2010" MS_Test_Root.cer
- 基于根证书签发二级CA证书,对应
Microsoft Testing PCA 2010节点:
makecert.exe -pe -ss CA -n "CN=Microsoft Testing PCA 2010" -is Root -in "Microsoft Testing Root Certificate Authority 2010" MS_Test_PCA.cer
- 基于二级CA签发终端代码签名证书,对应
Microsoft Windows Publisher节点,加上代码签名增强型密钥用法:
makecert.exe -pe -ss My -n "CN=Microsoft Windows Publisher" -is CA -in "Microsoft Testing PCA 2010" -eku 1.3.6.1.5.5.7.3.3 MS_CodeSign.cer
- 用新生成的终端证书重新签名目标DLL:
signtool sign /fd sha1 /n "Microsoft Windows Publisher" "myfile.dll"
- 执行带
/pa参数的验证命令即可通过。
注意事项
- 上述自生成的证书仅在你手动导入了根证书的设备上可信,拷贝到其他未导入根证书的设备上依然会报不信任错误
- 如果需要在公开环境分发签名后的文件,需要向具备公开信任资质的CA机构购买正规代码签名证书
makecert.exe已属于过时工具,Win10及以上系统推荐使用PowerShell内置的New-SelfSignedCertificate命令生成自签名证书
内容的提问来源于stack exchange,提问作者GuangJun Liu
相关产品推荐
相关产品推荐

