如何用Electron-Builder自动签名.exe解决Windows自动更新签名问题
Electron Windows端自动更新签名问题解决
问题背景
在Electron Windows端实现自动更新时,触发错误提示:New version not signed by application owner,需为可执行文件签名解决该问题。同时执行自动构建发布命令时,签名流程报错文件找不到,手动签名则正常。
当前配置
package.json中的Windows构建配置
"win": { "publisherName": [ "XXX" ], "icon": "build/icon.ico", "sign": "./sign.js" },
初始sign.js签名脚本
exports.default = async function(configuration) { // 不要在文件中包含密码或敏感数据,改用环境变量存储 // const CERTIFICATE_NAME = process.env.WINDOWS_SIGN_CERTIFICATE_NAME; // const TOKEN_PASSWORD = process.env.WINDOWS_SIGN_TOKEN_PASSWORD; require("child_process").execSync( // 示例使用JSign的签名命令 `java -jar jsign.jar \ --storetype GOOGLECLOUD \ --storepass "$(gcloud auth print-access-token)" \ --keystore "projects/XXX/locations/XXX/keyRings/XXX" \ --alias "YYYY" \ --certfile "ZZZZ" \ --tsmode RFC3161 \ --tsaurl http://timestamp.globalsign.com/tsa/r6advanced1 \ './release/build/MyProgram Setup 6.4.1.exe'` ); };
遇到的具体问题
手动构建后执行签名可正常完成,但运行命令 electron-builder build --w --publish always 时,自动签名流程报错:
The file ./release/build/MyProgram Setup 6.4.1.exe couldn't be found
尝试添加{stdio:"inherit"}参数后问题仍未解决。同时存在疑问:自动更新是否必须签名?(日志提示未签名exe无法运行)
解决方法
修改sign.js脚本,使用electron-builder传递的configuration.path动态获取待签名文件路径,替代硬编码的固定路径:
exports.default = async function(configuration) { // 不要在文件中包含密码或敏感数据,改用环境变量存储 // const CERTIFICATE_NAME = process.env.WINDOWS_SIGN_CERTIFICATE_NAME; // const TOKEN_PASSWORD = process.env.WINDOWS_SIGN_TOKEN_PASSWORD; console.log(configuration, "CONFIG for sign") require("child_process").execSync( // 示例使用JSign的签名命令 `java -jar jsign.jar \ --storetype GOOGLECLOUD \ --storepass "$(gcloud auth print-access-token)" \ --keystore "projects/XXXX/locations/XXX/keyRings/XXX" \ --alias "XXX" \ --certfile "./path/to/certfile" \ --tsmode RFC3161 \ --tsaurl http://timestamp.globalsign.com/tsa/r6advanced1 \ "${configuration.path}"`, { stdio: "inherit" } ); };
关键说明
- 自动更新必须签名:Electron自动更新机制要求新版本与旧版本使用同一证书签名,否则会触发签名不匹配错误;且Windows系统会拦截未签名的exe运行,日志也会明确提示未签名程序无法执行。
- 修复核心:硬编码文件路径在自动构建流程中不可靠,版本号、临时构建路径可能动态变化,通过
configuration.path可获取electron-builder实时传递的待签名文件的正确路径。
内容的提问来源于stack exchange,提问作者Aatish Parson
相关产品推荐
相关产品推荐

