You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Electron Builder对打包的DLL文件进行代码签名的相关问题问询

问题1:electron-builder默认不对关联DLL签名的原因
  • electron-builder的默认签名逻辑仅覆盖应用主EXE、安装程序、卸载程序三类核心文件,Electron自带的Chromium/Node依赖DLL、第三方依赖的次级DLL不在默认签名队列的设计范围内,因此会被直接忽略。
  • 早期Windows系统的安全校验规则仅要求主程序和安装包签名即可正常运行,electron-builder的默认签名逻辑没有适配后续更严格的DLL签名校验要求。
  • 第三方依赖引入的预编译DLL归属不明确,electron-builder默认不会修改这类非项目直接产出的二进制文件,避免引发兼容性或版权纠纷。
问题2:将DLL纳入签名流程的实现方法

最常用的方案是通过electron-builder暴露的afterPack钩子,在打包完成后、安装包生成前批量对指定DLL执行签名操作:

  1. 首先在项目package.json的build配置中声明钩子路径:
{
  "build": {
    "win": {
      "target": "nsis",
      "signingHashAlgorithms": ["sha256"],
      "certificateFile": "你的证书存储路径.pfx",
      "certificatePassword": "你的证书密码"
    },
    "afterPack": "./after-pack.js"
  }
}
  1. 在项目根目录新建after-pack.js文件,编写DLL遍历、签名逻辑:
const { exec } = require('child_process');
const path = require('path');
const fs = require('fs');

exports.default = async function(context) {
  // 打包后的应用文件输出目录
  const appOutputDir = context.appOutDir;
  // 你需要签名的DLL清单
  const targetDlls = [
    "ffmpeg.dll",
    "libeay32.dll",
    "libEGL.dll",
    "libGLESv2.dll",
    "sqlite3.dll"
  ];

  for (const dllName of targetDlls) {
    const dllFullPath = path.join(appOutputDir, dllName);
    if (fs.existsSync(dllFullPath)) {
      // 替换为你本地的signtool路径和签名参数,以下为示例命令
      const signCommand = `signtool sign /f 你的证书路径.pfx /p 证书密码 /t http://timestamp.digicert.com /fd sha256 "${dllFullPath}"`;
      await new Promise((resolve, reject) => {
        exec(signCommand, (err) => err ? reject(err) : resolve());
      });
    }
  }
}

注意:需要提前将Windows SDK的signtool加入系统环境变量,或在命令中写死signtool的绝对路径,避免执行时报错。如果你使用云签名服务,将上述signtool命令替换为对应云签名工具的命令行指令即可。

内容的提问来源于stack exchange,提问作者Juan Cortines

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:45:00