代码签名 Electron Builder / Updater 后校验和不匹配

问题描述 投票:0回答:4

在构建过程中运行适用于 Windows / NSIS 的电子构建器后,我们的开发运营团队设置了一个构建脚本,该脚本运行以在部署之前对 exe 进行代码签名。到达服务器后,Electron-Updater 因 sha512 校验和不匹配而失败(完全下载后在安装过程中发生错误)。我还尝试从服务器上拉下 exe 文件并从 Visual Studio CMD 运行 codesign util,然后重新上传。自动更新程序也失败并出现相同的错误。

是否无法在生成 exe 后对其进行签名,并且仍然允许自动更新程序工作?

签名:

signtool.exe sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /sha1 value "path"



日志:

Error: sha512 checksum mismatch, expected [value], got [different value]



package.json中的配置:

"build": { "appId": "com.stripped.stripped.stripped", "directories": { "output": "dist-exe", "app": "dist" }, "win": { "target": "nsis", "icon": "dist/assets/favicon/favicon-256x256.ico", "verifyUpdateCodeSignature": false, "publish": { "provider": "generic", "url": "##{ElecronAppUpdaterLocation}##" } }, "nsis": { "artifactName": "Setup_${version}.${ext}", "installerIcon": "dist/assets/favicon/favicon-256x256.ico", "installerHeaderIcon": "dist/assets/favicon/favicon-256x256.ico" } }
    
electron code-signing electron-builder
4个回答
4
投票
如果有人仍在寻找手动生成电子校验和,您可以使用此处提到的脚本

https://github.com/electron-userland/electron-builder/issues/3913#issuecomment-504698845

我已经测试过它,它工作正常,Electron 能够将应用程序更新到具有手动生成的校验和的版本。

const path = require('path'); const fs = require('fs'); const crypto = require('crypto'); const YOUR_FILE_PATH = ''; // POPULATE THIS function hashFile(file, algorithm = 'sha512', encoding = 'base64', options) { return new Promise((resolve, reject) => { const hash = crypto.createHash(algorithm); hash.on('error', reject).setEncoding(encoding); fs.createReadStream( file, Object.assign({}, options, { highWaterMark: 1024 * 1024, /* better to use more memory but hash faster */ }) ) .on('error', reject) .on('end', () => { hash.end(); console.log('hash done'); console.log(hash.read()); resolve(hash.read()); }) .pipe( hash, { end: false, } ); }); } const installerPath = path.resolve( __dirname, YOUR_FILE_PATH ); hashFile(installerPath);
    

2
投票
在解决这个问题几个小时后,我发现了以下内容: (案例:win、nsis)

  1. 当我使用电子构建器构建应用程序时,它会生成一个 .exe 文件,之后计算其哈希并将其保存在另一个名为latest.yml的文件中

  2. 这两个已上传到更新服务器(在我的例子中是github)

  3. 当应用程序的先前版本更新时,它会再次下载.exe和latest.yml文件,重新计算.exe的哈希值并检查它是否仍然相同(意味着可执行文件未被操纵)

  4. 出现此问题的原因是,当它对下载的 .exe 进行哈希处理时,它不会返回预期的结果。就我而言,发生这种情况是因为我有一个单独的代码签名脚本来签署我的构建。我发现我的构建的哈希在签名后发生了变化,因此应该在我的版本中更新latest.yml 文件。

为了解决这个问题,我使用了上面答案中给出的签名脚本。当我完成构建和签名 .exe 后,我使用上面的脚本重新计算其哈希值,然后相应地更新latest.yml。

当我这样做时,自动更新效果很好,希望它有帮助>

<



0
投票
我昨天遇到了这个问题,同时也在努力解决一个非常相似的设置。就我而言,我能够使用电子构建器的内置支持自定义签名脚本,该脚本很可能是在最初提出这个问题后添加的。

我的设置是,我正在 Linux 上构建 Windows NSIS 目标,并且我想使用存储在 USB 记忆棒上的 EV 代码签名证书对其进行签名。我还没有力量尝试让它在 Linux 上工作,所以目前我的脚本将暂停 electro-bulder 进程,直到我使用在同一机器上运行的 Windows VM 完成手动签名 .exe(基本但它有效)。

我的 package.json 的相关部分是

"build": { ... "win": { ... "sign": "scripts/sign.js", "signingHashAlgorithms": ["sha256"], # sign.js will be called once for each hash algorithm ... }, "nsis": { ... } }
我的sign.js 文件看起来像

const readline = require("node:readline") const { stdin: input, stdout: output } = require("node:process") const INSTALLER_PREFIX = ... // Set expected installer prefix here // A very low tech placeholder to last until we can work out how to sign using the // Sectigo EV USB on the linux command line exports.default = async function (configuration) { if (configuration.path.startsWith(INSTALLER_PREFIX)) { const rl = readline.createInterface({ input, output }) await new Promise(function(resolve) { rl.question("Please sign the exe and press enter when complete... ", () => { rl.close() resolve() }) }); } }
这个脚本可以使用新的 Node JS Promise API 进行一些简化,但它在我当前使用的 NodeJS 版本中不可用。

一旦签名完成,电子构建器将继续计算签名的 exe 的 sha512 校验和,并且所有这些都可以与自动更新程序配合使用。

© www.soinside.com 2019 - 2024. All rights reserved.