與 Electron Builder 整合
本文件說明如何將遠端程式碼簽章服務整合至 Electron 應用程式的建置流程,使用 electron-builder 對 Windows 平台的安裝套件與可執行檔進行自動簽章。
提示
這裡使用一個開源專案進行測試 vite-electron-builder。
先決條件
- 已擁有可用的 sslTrus 遠端程式碼簽章服務帳戶,並取得有效的存取憑證(AK/SK)。
- 已有一個用於簽章的遠端程式碼簽章服務。
- 專案基於
electron-builder進行建置。
整合步驟
步驟一:設定 Electron Builder 檔案
在您的 Electron 專案根目錄中,找到並修改 electron-builder.mjs (或 electron-builder.yml/config.js) 檔案。
以下是一個完整的設定範例,需要修改預設設定,新增 signtoolOptions.sign 自訂簽章方法。
export default /** @type import('electron-builder').Configuration */
({
win: {
target: [
{
target: 'nsis',
arch: ['x64'],
},
],
signtoolOptions: {
sign: customSign,
signingHashAlgorithms: ['sha256'], // 这里只需要选择一个即可,实际的双签由 customSign 执行
},
},
});
async function customSign(configuration) {
const srcPath = configuration.path;
const cwd = process.cwd();
const relPath = relative(cwd, srcPath);
// 设置环境变量 export SIGNTOOL_ACCESS_KEY='' SIGNTOOL_ACCESS_SECRET='' SIGNTOOL_CERT_CODE=''
const {SIGNTOOL_ACCESS_KEY, SIGNTOOL_ACCESS_SECRET, SIGNTOOL_CERT_CODE} = process.env;
if (!SIGNTOOL_ACCESS_KEY || !SIGNTOOL_ACCESS_SECRET || !SIGNTOOL_CERT_CODE) {
console.error(`[ERROR] Missing environment variables: SIGNTOOL_ACCESS_KEY, SIGNTOOL_ACCESS_SECRET, SIGNTOOL_CERT_CODE`);
return;
}
// 下载对应平台的命令行工具
const signtoolPath = join(cwd, 'signtool', 'signtool');
const dir = dirname(srcPath);
const ext = extname(srcPath);
const name = basename(srcPath, ext);
const randomStr = randomBytes(4).toString('hex');
const tempPath = join(dir, `${name}-${randomStr}${ext}`);
const startTime = Date.now();
try {
console.log(`[SIGNING] ${relPath}`);
const logFilePath = join(cwd, 'signtool', name + '.log');
writeFileSync(logFilePath, `Source: ${srcPath}\nTime: ${new Date().toLocaleString()}\n\n`);
const logFd = openSync(logFilePath, 'a');
// 签名默认不会覆盖源文件,且目标文件不存在,所以先将源文件重命名为临时文件
renameSync(srcPath, tempPath);
// 参数可参考 signtool 命令行解析
const command = [
signtoolPath,
'sign',
`-k "${SIGNTOOL_ACCESS_KEY}"`,
`-s "${SIGNTOOL_ACCESS_SECRET}"`,
`-c "${SIGNTOOL_CERT_CODE}"`,
`-f "${tempPath}"`, // 源文件
`-o "${srcPath}"`, // 目标文件
'--nest=true', // 嵌套签名
'--sha1=false', // sha1 签名,对于 bool 值的参数传递需要使用 arg=value 的方式,不可使用 arg value 的形式
'--timestamp http://timestamp.sectigo.com',
'--sha2=true', // sha2 签名
'--timestamp-rfc3161 http://timestamp.sectigo.com',
].join(' ');
// 将 signtool 的日志输出到文件
execSync(command, {stdio: ['ignore', logFd, logFd]});
// 删除临时文件
rmSync(tempPath, {force: true});
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
console.log(`[SUCCESS] Finished in ${duration}s -> ${relPath}`);
} catch (e) {
console.error(`[FAILURE] Failed to sign: ${relPath}`);
console.error(` Check log: signtool/${name}.log`);
process.exit(1);
}
}
步驟二:編譯
設定完成後,執行您的 Electron 建構命令。建構過程中會自動呼叫上述自訂簽章函數。
# 示例:构建 Windows 64位 安装包
npm run compile -- --win --x64
# 或使用 npx
npx electron-builder build --config electron-builder.mjs --win --x64
編譯過程

編譯結果
安裝套件以及主程式都已完成簽章

