InstallShield 在 Windows 11 签名 .mst 时出现 0x80092006
结论
先检查 InstallShield 实际读取的证书是否关联了可用的私钥提供程序,并确认构建进程能否访问该提供程序。0x80092006 对应 CRYPT_E_NO_PROVIDER,表示没有为存储区或对象指定提供程序。仅凭这段日志,无法确定原因是证书关联缺失、运行账户差异,还是 InstallShield 签名路径的兼容性问题。Microsoft 错误码定义
signtool 能签名 .EXE 和 .DLL,说明成功执行该命令的环境具备签名能力。但无法据此判断 InstallShield 的 SigningHelper 使用的证书存储区、提供程序和运行环境是否相同,也无法判断 .mst 是否经过相同的签名流程。
1. 对比证书存储区和私钥关联
先记录成功签名时使用的完整 signtool 路径、命令参数、Windows 账户和证书指纹,再与 InstallShield 的配置逐项比较。
注意区分“当前用户”和“本地计算机”两个证书存储区。同一张证书可能同时出现在两处,但其中一份没有正确的私钥关联。即使已经安装证书,也要确认构建进程能否通过该证书访问 KeyLocker。
可以用以下命令查看两处 My 存储区中的证书,将占位符替换为实际证书指纹:
certutil -user -v -store My "CERTIFICATE_THUMBPRINT"
certutil -v -store My "CERTIFICATE_THUMBPRINT"
重点对比证书指纹、Provider、Key Container 及相关错误信息。第一条检查当前用户存储区,第二条检查本地计算机存储区。参数含义可参照 Microsoft certutil 文档。
如果 InstallShield 读取的那份证书缺少提供程序或密钥关联,应按 KeyLocker 的配置流程修复,再重新选择证书。不要仅凭证书显示名称判断两处配置完全相同。
2. 在构建账户下检查 KeyLocker
使用运行 InstallShield 构建的 Windows 账户执行:
smctl healthcheck
检查认证、签名权限和签名工具配置。该命令是 DigiCert 提供的环境诊断入口,具体输出会随工具版本和认证方式变化。KeyLocker healthcheck 文档
如果尚未完成 KSP 注册或证书同步,可按当前客户端的配置说明执行对应步骤,例如:
smctl windows ksp register
smctl windows certsync --keypair-alias=YOUR_KEYPAIR_ALIAS
其中 YOUR_KEYPAIR_ALIAS 必须替换为实际密钥别名。这些命令用于配置提供程序及同步证书,执行后仍需确认 .mst 签名问题是否解决。DigiCert KeyLocker 配置说明
如果交互式命令行可以签名,而自动构建失败,应继续检查构建账户的认证配置、客户端认证证书访问权限和环境变量。修改环境配置后,重新启动 InstallShield,让新进程读取配置。
3. 用相同条件复现签名
先保留原来成功的命令作为基准。下面演示按指纹从当前用户 My 存储区选择证书的测试方式,请使用文件的测试副本:
signtool.exe sign /debug /v /s My /sha1 "CERTIFICATE_THUMBPRINT" /fd SHA256 "C:\sign-test\sample.exe"
如果证书位于本地计算机存储区,增加 /sm。其中 /sha1 用于选择证书指纹,文件摘要算法由 /fd SHA256 指定。Microsoft SignTool 文档
还应记录成功使用的是 x86 还是 x64 版本的 signtool.exe,并核对 InstallShield 签名组件的进程架构和对应提供程序是否可用。架构差异是一个排查方向,没有日志证据时不能将其认定为根因。
这个测试用于比较账户、证书和提供程序的访问条件。不要直接把目标文件改成 1025.mst,并假定通用 signtool 签名可以替代 InstallShield 对 transform 的处理。
4. 确认旧版 InstallShield 的签名路径是否兼容
KeyLocker 的 KSP 基于 Microsoft CNG。如果证书关联和账户配置都正常,而失败始终局限于 InstallShield 对 .mst 的签名,应进一步核对该版本、该文件类型的签名实现能否使用当前提供程序。现有信息不足以断言 InstallShield 2020 Premier R2 的所有签名功能都不支持 KeyLocker。KeyLocker KSP 文档
DigiCert 提供的 InstallShield 自定义签名集成方案要求 InstallShield 2023 R2 或更高版本,通过 Signing Type = Custom 调用脚本和外部签名工具。因此,该配置方法不能直接套用到 2020 Premier R2。DigiCert 集成说明
如果需要采用这条集成路径,应先验证目标版本对项目中 .mst 签名环节的具体支持,再决定是否升级。自定义签名入口本身不能保证原有 transform 签名流程可以被替代。
如果必须继续使用 2020 Premier R2,可向 Revenera 提供完整构建日志、证书指纹、Provider 和 Key Container 信息、成功的 signtool 命令及工具架构,请其确认 .mst 签名路径是否存在兼容限制或适用修复。提交日志时隐去 API key、密码等认证信息。
备注:内容仅供参考。
