跳转到主内容

代码签名

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

在 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

Detailed instructions on how to configure your application can be found in the Electron Forge Code Signing Tutorial.

使用 Electron Packager

If you're not using an integrated build pipeline like Forge, you are likely using electron-packager, which includes electron-osx-sign and electron-notarize.

If you're using Packager's API, you can pass in configuration that both signs and notarizes your application.

const packager = require('electron-packager')

packager({
dir: '/path/to/my/app',
osxSign: {
identity: 'Developer ID Application: Felix Rieseberg (LT94ZKYDCJ)',
'hardened-runtime': true,
entitlements: 'entitlements.plist',
'entitlements-inherit': 'entitlements.plist',
'signature-flags': 'library'
},
osxNotarize: {
appleId: 'felix@felix.fun',
appleIdPassword: 'my-apple-id-password'
}
})

此处引用的 entitlements.plist 文件需要以下特定于 macOS 权利,以让 Apple 安全机制能够知晓您的应用 在执行不会造成任何伤害的操作:

entitlements.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.debugger</key>
<true/>
</dict>
</plist>

请注意,直到Electron 12, com.apple.security.cs.allow-unsigned-executable-memory 的权限都是必需的。 但是,如果可以避免,则不应再使用它。

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

请参阅Mac 应用商店指南

签署windows应用程序

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

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

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

  • digicert
  • Sectigo
  • 也可以根据自身需求,选择其它的签名分销商。 😄
妥善保存您的证书密码

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

使用 Electron Forge

Electron Forge is the recommended way to sign your Squirrel.Windows and WiX MSI installers. Detailed instructions on how to configure your application can be found in the Electron Forge Code Signing Tutorial.

使用 electron-winstaller (Squirrel.Windows)

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

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',
certificateFile: './cert.pfx',
certificatePassword: 'this-is-a-secret',
})
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 Forge,并且想要直接使用 electron-wix-msi ,请使用 certificateFilecertificatePassword 配置选项 或将参数直接传递到 SignTool.exe 并带有 signWithParams 选项。

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

// 步骤1:实例化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',
certificateFile: './cert.pfx',
certificatePassword: 'this-is-a-secret',
})

// Step 2: 创建一个 .wxs 模板文件
const supportBinaries = await msiCreator.create()
// 🆕 步骤 2a: 如果可以选择对支持二进制文件进行签名
// 将二进制文件作为打包脚本的一部分进行签名
supportBinaries.forEach(async (binary) => {
// 二进制文件是新的存根可执行文件,可以选择
// Squirrel 自动更新程序。
await signFile(binary)
})

// 步骤 3:将模板编译为.msi文件
await msiCreator.compile()

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

使用 Electron Builder

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

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

参考 Windows Store Guide.