本文へスキップ

コード署名

コード署名は、アプリがあなたによって作成されたことを証明するセキュリティ技術です。オペレーティングシステムのセキュリティ警告をトリガーしないように、アプリケーションに署名する必要があります。

macOS Sonoma Gatekeeper warning: The app is damaged

WindowsとmacOSの両方で、署名されていないアプリケーションの実行をユーザーが妨げられます。コード署名なしでアプリケーションを配布することは可能ですが、実行するには、ユーザーが複数の高度で手動のステップを実行する必要があります。

パッケージ化して配布する予定のElectronアプリを構築する場合は、コード署名する必要があります。Electronエコシステムツールを使用すると、アプリのコード署名は簡単になります。このドキュメントでは、WindowsとmacOSの両方でアプリに署名する方法について説明します。

macOSビルドの署名と認証

macOSアプリケーションをリリース用に準備するには、2つの手順が必要です。まず、アプリにコード署名する必要があります。次に、アプリを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サムドライブのように見えます。

多くの証明書プロバイダーは現在、「クラウドベースの署名」を提供しています。署名ハードウェア全体がデータセンターにあり、それを利用してコードにリモートで署名できます。このアプローチは、GitHub Actions、CircleCIなど、CIでアプリケーションに署名することを比較的容易にするため、Electronのメンテナーの間で人気があります。

執筆時点では、Electron独自のアプリはDigiCert KeyLockerを使用していますが、ファイルに署名するためのコマンドラインツールを提供するプロバイダーであれば、Electronのツールと互換性があります。

Electronエコシステムのすべてのツールは@electron/windows-signを使用し、通常はwindowsSignプロパティを通じて構成オプションを公開します。これを使用してファイルを直接署名することも、Electron Forge、@electron/packagerelectron-winstallerelectron-wix-msiで同じwindowsSign構成を使用することもできます。

Electron Forgeの使用

Electron Forgeは、アプリだけでなく、Squirrel.WindowsおよびWiX 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 Storeアプリケーションの署名

Windows Storeガイドを参照してください。