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

WindowsとmacOSの両方で、署名されていないアプリケーションの実行をユーザーが妨げられます。コード署名なしでアプリケーションを配布することは可能ですが、実行するには、ユーザーが複数の高度で手動のステップを実行する必要があります。
パッケージ化して配布する予定のElectronアプリを構築する場合は、コード署名する必要があります。Electronエコシステムツールを使用すると、アプリのコード署名は簡単になります。このドキュメントでは、WindowsとmacOSの両方でアプリに署名する方法について説明します。
macOSビルドの署名と認証
macOSアプリケーションをリリース用に準備するには、2つの手順が必要です。まず、アプリにコード署名する必要があります。次に、アプリをAppleにアップロードして**認証**と呼ばれるプロセスを行う必要があります。このプロセスでは、自動化されたシステムが、アプリがユーザーを危険にさらすようなことを行っていないことをさらに検証します。
このプロセスを開始するには、アプリの署名と認証の要件を満たしていることを確認してください。
- Apple Developer Programへの登録(年間料金が必要です)
- Xcodeのダウンロードとインストール - macOSを実行しているコンピューターが必要です。
- 署名証明書の生成、ダウンロード、インストール
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証明書も提供している企業が販売しています。価格は異なるため、比較検討する価値があります。一般的な販売代理店には、以下が含まれます。
- Certum EVコード署名証明書
- DigiCert EVコード署名証明書
- Entrust EVコード署名証明書
- GlobalSign EVコード署名証明書
- IdenTrust EVコード署名証明書
- Sectigo(旧Comodo)EVコード署名証明書
- SSL.com EVコード署名証明書
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/packager、electron-winstaller、electron-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ガイドを参照してください。