一、为什么需要打包和签名

开发完一个Electron应用后,直接扔给用户安装可能会遇到各种问题。比如,Windows系统会弹出“未知发布者”警告,macOS甚至直接阻止运行。这就像你网购时收到一个没有品牌、没有质检标签的商品,谁敢放心用?

打包就是把你的代码、依赖和资源整理成一个标准的安装包(如.exe、.dmg)。签名则是给这个安装包加上“防伪认证”,告诉系统和用户:“这软件是我开发的,没被篡改过”。

二、Electron打包工具选型

目前主流的选择是electron-builder,它支持多平台打包,还能自动处理签名流程。相比之下,electron-packager虽然轻量,但签名需要额外配置。

示例:安装electron-builder

# 在项目中安装electron-builder(技术栈:Node.js)
npm install electron-builder --save-dev

配置示例(package.json片段)

{
  "build": {
    "appId": "com.example.myapp",
    "win": {
      "target": "nsis",
      "certificateFile": "./certs/my-cert.pfx",
      "certificatePassword": "yourpassword"
    },
    "mac": {
      "target": "dmg",
      "identity": "Developer ID Application: Your Name (XXXXXXXXXX)"
    }
  }
}

注释说明:

  • appId:应用唯一标识,建议反向域名格式
  • win/mac:平台特定配置
  • certificateFile:Windows签名证书文件路径
  • identity:macOS开发者ID(需提前申请)

三、获取签名证书

Windows平台

需要购买代码签名证书(如DigiCert、Sectigo)。流程:

  1. 生成CSR文件
  2. 向CA机构提交申请
  3. 审核通过后获取.pfx证书文件

OpenSSL生成CSR示例

# 生成私钥和CSR(技术栈:OpenSSL)
openssl req -newkey rsa:2048 -nodes -keyout private.key -out request.csr

注释:

  • -nodes:不加密私钥
  • 执行后会提示输入国家、公司等信息

macOS平台

需加入Apple开发者计划(年费$99),然后在Xcode中申请Developer ID Application证书。

四、完整打包签名实战

示例:完整打包命令

# 生成带签名的安装包(技术栈:Node.js)
electron-builder --win --mac --publish never

关键流程分解:

  1. 打包器会自动读取package.json中的配置
  2. 对于Windows,会调用signtool进行签名
  3. 对于macOS,使用codesign命令

调试签名问题
如果签名失败,可以手动验证:

# macOS验证签名
codesign -dv --verbose=4 /path/to/your.app

# Windows验证签名
signtool verify /v /pa your_installer.exe

五、常见坑与解决方案

  1. 时间戳服务失效
    签名时需要添加时间戳,否则证书过期后签名会失效。推荐使用http://timestamp.digicert.com

    修正配置示例

    "win": {
      "signingHashAlgorithms": ["sha256"],
      "rfc3161TimeStampServer": "http://timestamp.digicert.com"
    }
    
  2. macOS公证(Notarization)
    从macOS 10.15开始,还需将应用提交Apple公证:

    electron-builder --mac --publish never --config.afterSign=./notarize.js
    

    需要编写notarize.js脚本处理Apple ID和密码。

六、安全认证的深层逻辑

签名不仅仅是“加个标签”,它实际做了三件事:

  1. 完整性校验 - 通过哈希值确保文件未被修改
  2. 身份验证 - 证书链追溯到受信任的CA机构
  3. 抗抵赖 - 开发者不能否认自己发布的版本

证书链示意图

你的证书 → 中级CA证书 → 根CA证书

七、进阶:自动化CI/CD流程

在GitHub Actions中实现自动签名:

# .github/workflows/release.yml示例
jobs:
  release:
    steps:
      - uses: actions/checkout@v2
      - run: npm install
      - run: electron-builder --win --mac --publish never
        env:
          CSC_LINK: ${{ secrets.CSC_LINK }}  # Base64编码的.pfx文件
          CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}

八、技术方案对比

方案 优点 缺点
自签名证书 免费 不被系统信任
商业证书 全平台兼容 年费$100+
Apple公证 必需流程 需等待10-30分钟

九、总结与决策建议

  1. 个人项目:Windows可用自签名证书+禁用安全警告,macOS建议走正规流程
  2. 企业项目:必须购买商业证书,预算应包括每年的续费成本
  3. 紧急发布:可先打包未签名版本供内测,同时申请证书

最后提醒:永远保留证书备份!丢失证书意味着所有已发布版本都会变成“不可信”。