使用Mono编译Signtool.exe及运行时遇错,寻求解决方案
问题分析与解决方法
1. Wine运行signtool.exe报错(0x80090001)
错误Store::ImportCertObject() failed是Wine对Windows CryptoAPI的模拟缺陷导致,直接通过/f参数加载PFX证书时,Wine无法正确处理证书导入流程。
解决步骤:
- 先将PFX证书导入Wine的系统证书存储:
- 执行
wine certmgr.msc打开Wine证书管理器 - 定位到「个人」存储区,右键导入你的PFX证书,输入证书密码完成导入
- 修改signtool命令,通过证书存储和名称指定证书,不再直接加载PFX文件:
xvfb-run wine signtool.exe sign /debug /s MY /n "你的证书显示名称" /fd SHA256 [文件路径] - 执行
- 确保Wine版本为8.x及以上,老版本的CryptoAPI兼容问题更严重,建议升级到最新稳定版。
2. Mono无法运行signtool.exe
微软官方的signtool.exe是原生Windows PE程序,并非.NET CIL程序集,而Mono仅支持运行.NET编译的CIL代码,因此直接用Mono执行必然报错,此路径不可行。
3. 编译.NET版SignTool报错(CreateManifestResourceNames目标不存在)
你使用的Mono msbuild不支持.NET SDK内置的项目目标(CreateManifestResourceNames是官方.NET SDK的核心目标之一),必须用微软官方的.NET SDK编译该项目。
解决步骤:
- 安装官方.NET SDK(推荐.NET 7或8版本),替代Mono的msbuild工具
- 使用
dotnet build命令编译,而非Mono的msbuild:dotnet build Microsoft.DotNetSignTool.csproj /restore - 注意:编译后的跨平台SignTool可能不支持Office VBA宏签名(VBA签名依赖Windows特定的Authenticode扩展),需先测试验证。
Office VBA宏签名的可靠替代方案
由于VBA宏签名对微软Authenticode格式的依赖极强,跨平台工具兼容性差,以下是最稳定的两种方案:
- Windows虚拟机:在Linux环境下运行Windows虚拟机,直接使用官方signtool完成签名,这是兼容性最好的方案
- 完善Wine环境:使用64位Wine,通过
winetricks crypt32安装完整的加密组件,重新导入证书后再尝试签名操作
内容的提问来源于stack exchange,提问作者jqlifice
相关产品推荐
相关产品推荐

