跳转到主要内容

代码签名

代码签名是一种安全技术,用于证明应用程序是由您创建的。您应该对您的应用程序进行签名,以避免触发任何操作系统安全警告。

macOS Sonoma Gatekeeper warning: The app is damaged

Windows 和 macOS 都会阻止用户运行未签名的应用程序。虽然可以分发未进行代码签名的应用程序,但为了运行它们,用户需要经过多个高级且手动步骤。

如果您正在构建一个您打算打包和分发的 Electron 应用程序,则应该对其进行代码签名。Electron 生态系统工具使应用程序的代码签名变得简单明了 - 本文档解释了如何在 Windows 和 macOS 上对您的应用程序进行签名。

macOS 构建的签名和公证

准备 macOS 应用程序以供发布需要两个步骤:首先,应用程序需要进行代码签名。然后,应用程序需要上传到 Apple 进行一个名为 公证 的过程,在此过程中,自动化系统将进一步验证您的应用程序是否没有对用户造成任何危害。

要开始此过程,请确保您满足对应用程序进行签名和公证的要求

  1. 注册 Apple 开发者计划(需要每年支付费用)
  2. 下载并安装 Xcode - 这需要一台运行 macOS 的计算机
  3. 生成、下载和安装 签名证书

Electron 生态系统倾向于配置和自由,因此有多种方法可以对您的应用程序进行签名和公证。

使用 Electron Forge

如果您正在使用 Electron 最喜欢的构建工具,对您的应用程序进行签名和公证需要在您的配置中添加一些内容。 Forge 是官方 Electron 工具的集合,在底层使用 @electron/packager@electron/osx-sign@electron/notarize

有关如何配置您的应用程序的详细说明,请参阅 Electron Forge 文档中的 macOS 应用程序签名 指南。

使用 Electron Packager

如果您没有使用像 Forge 这样的集成构建管道,您可能正在使用 @electron/packager,它包含 @electron/osx-sign@electron/notarize

如果您正在使用 Packager 的 API,您可以传递 配置以同时签名和公证您的应用程序。 如果下面的示例不满足您的需求,请参阅 @electron/osx-sign@electron/notarize 以获取许多可能的配置选项。

const packager = require('@electron/packager')

packager({
dir: '/path/to/my/app',
osxSign: {},
osxNotarize: {
appleId: 'felix@felix.fun',
appleIdPassword: 'my-apple-id-password'
}
})

签名 Mac App Store 应用程序

请参阅 Mac App Store 指南

签名 Windows 构建

使用传统证书

在您能够对应用程序进行代码签名之前,您需要获取代码签名证书。 与 Apple 不同,Microsoft 允许开发人员在公开市场上购买这些证书。 通常由同时提供 HTTPS 证书的公司出售。 价格各不相同,因此花时间货比三家可能是值得的。 热门经销商包括

重要的是指出,自 2023 年 6 月起,Microsoft 要求软件使用“扩展验证”证书(也称为“EV 代码签名证书”)进行签名。 过去,开发人员可以使用更简单且更便宜的证书(称为“authenticode 代码签名证书”或“基于软件的 OV 证书”)来签名软件。 这些更简单的证书不再提供好处:Windows 会将您的应用程序视为完全未签名,并显示相应的警告对话框。

新的 EV 证书需要存储在符合 FIPS 140 Level 2、Common Criteria EAL 4+ 或同等标准的硬件存储模块上。 换句话说,证书不能简单地下载到 CI 基础设施上。 在实践中,这些存储模块看起来像花哨的 USB 拇指驱动器。

许多证书提供商现在提供“基于云的签名” - 整个签名硬件位于其数据中心,您可以使用它来远程签名代码。 这种方法在 Electron 维护者中很受欢迎,因为它使在 CI(如 GitHub Actions、CircleCI 等)中签名您的应用程序相对容易。

在撰写本文时,Electron 自己的应用程序使用 DigiCert KeyLocker,但任何提供用于签名文件的命令行工具的提供商都将与 Electron 工具兼容。

Electron 生态系统中的所有工具都使用 @electron/windows-sign,并且通常通过 windowsSign 属性公开配置选项。 您可以使用它直接签名文件 - 或者在 Electron Forge、@electron/packagerelectron-winstallerelectron-wix-msi 中使用相同的 windowsSign 配置。

使用 Electron Forge

Electron Forge 是签名您的应用程序以及您的 Squirrel.WindowsWiX MSI 安装程序的推荐方法。 有关如何配置您的应用程序的详细说明,请参阅 Electron Forge 代码签名教程

使用 Electron Packager

如果您没有使用像 Forge 这样的集成构建管道,您可能正在使用 @electron/packager,它包含 @electron/windows-sign

如果您正在使用 Packager 的 API,您可以传递 配置以签名您的应用程序。 如果下面的示例不满足您的需求,请参阅 @electron/windows-sign 以获取许多可能的配置选项。

const packager = require('@electron/packager')

packager({
dir: '/path/to/my/app',
windowsSign: {
signWithParams: '--my=custom --parameters',
// If signtool.exe does not work for you, customize!
signToolPath: 'C:\\Path\\To\\my-custom-tool.exe'
}
})

使用 electron-winstaller (Squirrel.Windows)

electron-winstaller 是一个可以为您的 Electron 应用程序生成 Squirrel.Windows 安装程序的包。 这是 Electron Forge 的 Squirrel.Windows Maker 在底层使用的工具。 就像 @electron/packager 一样,它在底层使用 @electron/windows-sign 并支持相同的 windowsSign 选项。

const electronInstaller = require('electron-winstaller')
// NB: Use this syntax within an async function, Node does not have support for
// top-level await as of Node 12.
try {
await electronInstaller.createWindowsInstaller({
appDirectory: '/tmp/build/my-app-64',
outputDirectory: '/tmp/build/installer64',
authors: 'My App Inc.',
exe: 'myapp.exe',
windowsSign: {
signWithParams: '--my=custom --parameters',
// If signtool.exe does not work for you, customize!
signToolPath: 'C:\\Path\\To\\my-custom-tool.exe'
}
})
console.log('It worked!')
} catch (e) {
console.log(`No dice: ${e.message}`)
}

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

使用 electron-wix-msi (WiX MSI)

electron-wix-msi 是一个可以为您的 Electron 应用程序生成 MSI 安装程序的包。 这是 Electron Forge 的 MSI Maker 在底层使用的工具。 就像 @electron/packager 一样,它在底层使用 @electron/windows-sign 并支持相同的 windowsSign 选项。

import { MSICreator } from 'electron-wix-msi'

// Step 1: Instantiate the MSICreator
const msiCreator = new MSICreator({
appDirectory: '/path/to/built/app',
description: 'My amazing Kitten simulator',
exe: 'kittens',
name: 'Kittens',
manufacturer: 'Kitten Technologies',
version: '1.1.2',
outputDirectory: '/path/to/output/folder',
windowsSign: {
signWithParams: '--my=custom --parameters',
// If signtool.exe does not work for you, customize!
signToolPath: 'C:\\Path\\To\\my-custom-tool.exe'
}
})

// Step 2: Create a .wxs template file
const supportBinaries = await msiCreator.create()

// 🆕 Step 2a: optionally sign support binaries if you
// sign you binaries as part of of your packaging script
for (const binary of supportBinaries) {
// Binaries are the new stub executable and optionally
// the Squirrel auto updater.
await signFile(binary)
}

// Step 3: Compile the template to a .msi file
await msiCreator.compile()

有关完整的配置选项,请查看 electron-wix-msi 仓库!

使用 Electron Builder

Electron Builder 带有用于签名您的应用程序的自定义解决方案。 您可以在 此处 找到其文档。

使用 Azure Trusted Signing

Azure Trusted Signing 是 Microsoft 的现代云端 EV 证书替代方案。 它是 Windows 上代码签名的最便宜选择,并且可以消除 SmartScreen 警告。

截至 2025 年 10 月,Azure Trusted Signing 可供在美国和加拿大运营且拥有 3 年以上可验证业务历史记录的组织以及美国和加拿大的个人开发者使用。 Microsoft 正在努力使该计划更广泛地可用。 如果您在稍后阅读本文,那么检查资格标准是否已更改可能是有意义的。

使用 Electron Forge

Electron Forge 是签名您的应用程序以及 Squirrel.WindowsWiX MSI 安装程序的推荐方法。有关 Azure Trusted Signing 的说明,请参见 此处

使用 Electron Builder

Electron Builder 关于 Azure Trusted Signing 的文档可以在 此处 找到。

签名 Windows Store 应用程序

请参阅 Windows Store 指南