跳至主要內容

程式碼簽署

程式碼簽署是一種安全技術,用於驗證應用程式是否由您建立。您應該簽署您的應用程式,使其不會觸發任何作業系統安全警告。

macOS Sonoma Gatekeeper warning: The app is damaged

Windows 和 macOS 都會阻止使用者執行未簽署的應用程式。雖然可以發佈未簽署的應用程式,但為了執行它們,使用者需要進行多個進階的手動步驟。

如果您正在建構打算封裝和發佈的 Electron 應用程式,則應該進行程式碼簽署。Electron 生態系統工具使應用程式的程式碼簽署變得簡單明瞭 - 本文件將說明如何在 Windows 和 macOS 上簽署您的應用程式。

簽署 & 公證 macOS 版本

準備發佈的 macOS 應用程式需要兩個步驟:首先,應用程式需要進行程式碼簽署。然後,應用程式需要上傳到 Apple 進行稱為 公證 的程序,自動化系統將進一步驗證您的應用程式是否會危害其使用者。

若要開始此程序,請確保您符合簽署和公證應用程式的要求

  1. 註冊 Apple Developer Program (需要年費)
  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 提供了用於簽署您的應用程式的客製化解決方案。您可以在這裡找到其文件

簽署 Windows 商店應用程式

請參閱Windows 商店指南