代码签名

代码签名是一种用来证明应用是由你创建的一种安全技术。 您应该对应用程序进行签名,以便它不会触发任何 操作系统安全检查。

在 macOS 上,系统可以检测对应用的任何更改,无论更改是 意外引入还是由恶意代码引入。

在Windows系统中,如果程序没有代码签名证书,或者代码签名授信级别较低时,系统同样会将其列为可信程序,只是当用户运行该应用时,系统会显示安全提示。 信任级别随着时间的推移构建,因此最好尽早开始代码签名。

即使开发者可以发布一个未签名的应用程序,但是我们并不建议这样做。 默认情况下,Windows 和 macOS 都会禁止未签名的应用的下载或运行。 从 macOS Catalina (10.15版本) 开始,用户需要操作很多个步骤来运行一个未签名的应用。

macOS Catalina Gatekeeper 警告:无法打开该应用程序,因为无法验证开发人员

如你所见,用户有两个选择:直接删除应用或者取消运行。 你不会想让用户看见该对话框。

如果你正在开发一款Electron应用,并打算将其打包发布,那你就应该为其添加代码签名。

签名 & 认证 macOS 版本

正确准备即将发布的 macOS 应用程序需要完成两个步骤。 首先, 应用需要进行代码签名。 然后,需要将该应用程序上传到Apple以进行称为 公证 的过程,其中自动化系统将进一步验证 您的应用程序是否未采取任何危害其用户的行为。

若要开始,请确保你满足签名要求并认证你的应用:

  1. 加入 Apple Developer Program(需要缴纳年费)
  2. 下载并安装 Xcode - 这需要一台运行 macOS 的计算机。
  3. 生成,下载,然后安装签名证书(signing certificates)

Electron 的生态系统有利于配置和自由,所以有多种方法让您的应用程序签名和公证。

使用 Electron Forge

如果你正在使用 Electron 最受欢迎的构建工具,创建你的应用程序签名 并经过公证仅需要对配置进行一些添加即可。 Forge 是官方的 Electron 工具的 集合,在hood下使用 electron-packager @electron/osx-sign @electron/notarize

请参见 Electron Forge 文档中的 签署 macOS 应用程序 指南了解如何配置应用程序详细说明。

使用 Electron Packager

如果你没有使用像 Forge 这样的集成构建流,你可能会使用 electron-packager,其中包括 @electron/osx-sign@electron/notarize

如果您正在使用 Packager 的 API,您可以通过配置 来签名并对您的应用程序进行公证

  1. const packager = require('electron-packager')
  2. packager({
  3. dir: '/path/to/my/app',
  4. osxSign: {},
  5. osxNotarize: {
  6. appleId: 'felix@felix.fun',
  7. appleIdPassword: 'my-apple-id-password'
  8. }
  9. })

对 Mac 应用商店应用程序进行签名

详见 Mac App Store Guide.

签署windows应用程序

在签署Windows应用程序前,你需要完成以下事项:

  1. 获取一个 Windows 身份验证码签名证书 (需要年度费用)
  2. 安装 Visual Studio 以获取签名工具 (免费 社区版 已足够)

您可以从许多经销商获得代码签名证书。 价格各异,所以值得你花点时间去货比三家。 常见经销商包括:

  • digicert
  • Sectigo
  • 也可以根据自身需求,选择其它的签名分销商。 😄

代码签名 - 图2妥善保存您的证书密码

您的证书密码应该被妥善保存。 不要公开分享,或者提交到您的开源代码中。

使用 Electron Forge

Electron Forge 是签署 Squirrel.WindowsWiX MSI 安装程序的推荐方式。 Electron Forge 代码签名教程 中提供了有关如何配置应用程序的详细说明。

使用 electron-winstaller (Squirrel.Windows)

electron-winstaller 可以为您的 Electron 程序创建 Squirrel.Windows 安装器。 这也是 Electron Forge 的 Squirrel.Windows Maker 底层在使用的工具。 如果您不使用 Electron Forge 并想直接使用 electron-winstaller ,请通过 certificateFilecertificatePassword 配置选项。

  1. const electronInstaller = require('electron-winstaller')
  2. // NB: Use this syntax within an async function, Node does not have support for
  3. // top-level await as of Node 12.
  4. try {
  5. await electronInstaller.createWindowsInstaller({
  6. appDirectory: '/tmp/build/my-app-64',
  7. outputDirectory: '/tmp/build/installer64',
  8. authors: 'My App Inc.',
  9. exe: 'myapp.exe',
  10. certificateFile: './cert.pfx',
  11. certificatePassword: 'this-is-a-secret',
  12. })
  13. console.log('It worked!')
  14. } catch (e) {
  15. console.log(`No dice: ${e.message}`)
  16. }

有关完整配置选项,请查看 electron-winstaller 库!

使用 electron-wix-msi (WiX MSI)

electron-wix-msi 是一个可以为您的 Electron 应用程序生成 MSI 安装程序的库。 这是 Electron Forge 的 MSI Maker 底层使用的工具。

如果您没有使用 Electron Forge,并且想要直接使用 electron-wix-msi ,请使用 certificateFilecertificatePassword 配置选项 或将参数直接传递到 SignTool.exe 并带有 signWithParams 选项。

  1. import { MSICreator } from 'electron-wix-msi'
  2. // 步骤1:实例化MSICreator
  3. const msiCreator = new MSICreator({
  4. appDirectory: '/path/to/built/app',
  5. description: 'My amazing Kitten simulator',
  6. exe: 'kittens',
  7. name: 'Kittens',
  8. manufacturer: 'Kitten Technologies',
  9. version: '1.1.2',
  10. outputDirectory: '/path/to/output/folder',
  11. certificateFile: './cert.pfx',
  12. certificatePassword: 'this-is-a-secret',
  13. })
  14. // Step 2: 创建一个 .wxs 模板文件
  15. const supportBinaries = await msiCreator.create()
  16. // 🆕 步骤 2a: 如果可以选择对支持二进制文件进行签名
  17. // 将二进制文件作为打包脚本的一部分进行签名
  18. supportBinaries.forEach(async (binary) => {
  19. // 二进制文件是新的存根可执行文件,可以选择
  20. // Squirrel 自动更新程序。
  21. await signFile(binary)
  22. })
  23. // 步骤 3:将模板编译为.msi文件
  24. await msiCreator.compile()

如需完整的配置选项,请查看 electron-wix-msi 存储库!

使用 Electron Builder

Electron Builder 附带一个自定义解决方案,用于签署应用程序。 你可以在这里找到 它的文档

对 Windows 应用商店应用程序进行签名

参考 Windows Store Guide.