WindowsやLinuxから、ElectronやTauriのMacアプリに署名して公証する
ElectronやTauriのアプリは、WindowsやLinuxで書けます。macOS向けのリリースは話が別です。Appleの署名と公証のツールはmacOSでしか動きません。それがないと、Macのユーザーには警告が表示され、アプリは開きません。このページでは、ビルド、署名、公証の手順を、当社が実行したコマンドとともに紹介します。
Macの工程にmacOSが必要な理由
作業をするのは、Appleの3つのツールです。codesignがアプリに署名します。notarytoolがアプリをAppleの公証サービスに送ります。staplerが、Appleから返ってきたチケットを添付します。3つともmacOSとXcodeに付属しています。AppleによるWindows版やLinux版はありません。
フレームワークのドキュメントも同じことを言っています。Tauriは、tauri buildをMacのコンピュータで実行するように書いています。Electron Forgeは、公証にはXcodeが必要だと書いています。当社はGitHub ActionsでLinux側も試しました。UbuntuのElectron Forgeは、.debと.rpmを作りました。macOSのパッケージを作らせようとすると失敗しました。
リリースの日までに必要なもの
- 有料のApple Developer Programのメンバーシップ。Appleによると年間99 USDです。
- Developer ID Applicationの証明書。作成できるのはチームのAccount Holderだけで、Xcodeか開発者サイトで作ります。
- Apple Accountのアプリ用パスワード、またはApp Store Connect APIキー。
- Team ID。開発者アカウントにある10文字のコードです。
Appleの公証サービスは、Hardened Runtimeと安全なタイムスタンプも求めます。electron-builderでは、下にあるとおり、設定の1行でHardened Runtimeをオンにできます。
署名のないビルドはどう見えるか
公式のcreate-tauri-appのテンプレートを、証明書なしでビルドしました。できたものに対して、次のチェックを実行しました。
npm create tauri-app@latest tauri-app -- --template vanilla --manager npm --yes cd tauri-app && npm install rustup target add aarch64-apple-darwin x86_64-apple-darwin npm run tauri build -- --target universal-apple-darwin APP=src-tauri/target/universal-apple-darwin/release/bundle/macos/tauri-app.app lipo -archs "$APP"/Contents/MacOS/* codesign --verify --deep --strict --verbose=2 "$APP" spctl -a -vv "$APP"
GitHubのmacos-26 runnerでの出力です。
x86_64 arm64 tauri-app.app: code object is not signed at all tauri-app.app: rejected source=no usable signature
ビルドには4分かかりました。8.23 MiBのユニバーサルな.appと、3.57 MiBの.dmgができました。Electron Forgeの.dmgも同じでした。codesignはSignature=adhocとTeamIdentifier=not setを表示し、spctlは拒否しました。ユーザーのMacでは、こうしたビルドはGatekeeperにブロックされます。
Electron Forge:makeの中で署名と公証
設定で指定すると、Forgeはnpm run makeの中で署名と公証を行います。以下は、ForgeのmacOS署名ガイドにある例です。
// forge.config.js
module.exports = {
packagerConfig: {
osxSign: {},
osxNotarize: {
appleId: process.env.APPLE_ID,
appleIdPassword: process.env.APPLE_PASSWORD,
teamId: process.env.APPLE_TEAM_ID
}
}
};そのあと、アーキテクチャごとにビルドします。当社は先に、標準のテンプレートにDMGのmakerを追加しました。どちらのビルドも25秒かかりませんでした。
npm install --save-dev @electron-forge/maker-dmg npm run make -- --arch=arm64 npm run make -- --arch=x64
標準のテンプレートで--arch=universalも試しました。"the number of mach-o files is not the same between the arm64 and x64 builds"というエラーで失敗しました。electron-builderのドキュメントにも、アーキテクチャごとのビルドがいちばん確実だと書かれています。
electron-builder:notarize: true
electron-builderは、証明書とAppleのログイン情報を環境変数から読み込みます。公証のページには、次の設定が載っています。
# electron-builder.yml
mac:
notarize: true
sign:
hardenedRuntime: true
# environment
CSC_LINK=/path/to/developer-id.p12
CSC_KEY_PASSWORD=...
APPLE_ID=you@example.com
APPLE_APP_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx
APPLE_TEAM_ID=ABCDE12345Tauri:変数を設定してからビルド
次の変数を設定すると、Tauriはtauri buildの中で署名と公証を行います。変数名は、TauriのmacOS署名ガイドによるものです。
export APPLE_SIGNING_IDENTITY="Developer ID Application: Your Name (ABCDE12345)" export APPLE_ID=you@example.com export APPLE_PASSWORD=xxxx-xxxx-xxxx-xxxx export APPLE_TEAM_ID=ABCDE12345 npm run tauri build -- --target universal-apple-darwin
どんなアプリでも手で公証する
ほかのツールキットを使うときや、1つの工程をやり直すときは、Appleのツールを自分で実行します。次のコマンドは、Appleの公証のドキュメントによるものです。ログイン情報を一度保存し、zipにして、送信して待ちます。
xcrun notarytool store-credentials "notarytool-password" \ --apple-id "you@example.com" --team-id ABCDE12345 \ --password xxxx-xxxx-xxxx-xxxx ditto -c -k --keepParent "MyApp.app" "MyApp.zip" xcrun notarytool submit MyApp.zip --keychain-profile "notarytool-password" --wait xcrun stapler staple "MyApp.app"
Appleによると、公証はたいてい1時間以内に終わります。ZIPにはチケットを添付できないので、.appに添付してから、もう一度zipにします。.dmgそのものを送信して添付することもできます。状態がInvalidなら、ログを読みます。
xcrun notarytool log <submission-id> --keychain-profile "notarytool-password" developer_log.json
レンタルのMacで行う
MacRunの1日パスは、専用のM6 Mac miniが$15です。Xcode 27.1が入っているので、codesign、notarytool、staplerはすぐに使えます。NodeとRustは入っていません。管理者権限とHomebrewが使えるので、自分でインストールできます。
- TailscaleでSSH接続するか、好きなVNCビューアでデスクトップを開きます。
- Apple AccountでXcodeにサインインし、そこでDeveloper IDの証明書を作ります。
- 証明書を鍵と一緒に.p12ファイルに書き出し、あとでCIに使えるように保管します。
- リポジトリをクローンし、ビルドして公証し、チケットを添付した.dmgをダウンロードします。
パスが終わるとMacのデータは消去されます。先にコードをpushし、.p12を手元にコピーしてください。リモートの画面でXcodeを使う方法は、WindowsからXcodeのガイドをご覧ください。
この用途でMacを借りるべきでない人
- すでにCIがあるチーム。GitHubのmacOS runnerなら、シークレットを使って署名と公証ができます。当社のElectronのジョブは2分として課金され、約12セントでした。Tauriのジョブは5分で、約31セントです。公証の待ち時間の分だけ、数分増えます。GitHub Actionsのガイドをご覧ください。
- Linuxだけのパイプライン。rcodesignは、LinuxやWindowsから署名と公証ができるオープンソースのツールです。App Store Connect APIキーが必要です。Appleのツールではなく、最後のリリースは2024年11月の0.29.0です。
- 毎週リリースする人。月額のrunnerは、初月が$104で、その後は月額$139です。中古のMacを買ったほうが、1年で見て安いかもしれません。
よくある質問
WindowsでMacアプリを公証できますか?
+
Appleのツールではできません。codesign、notarytool、staplerはmacOSでしか動きません。オープンソースのrcodesignなら、WindowsやLinuxから署名と公証ができますが、Appleが作ったものでも、サポートしているものでもありません。
公証には有料のApple Developerアカウントが必要ですか?
+
必要です。Developer ID Applicationの証明書が必要で、これは年間99 USDのApple Developer Programに含まれます。Tauriのドキュメントによると、無料のアカウントでは公証できません。
Electron ForgeはLinuxでMacの.dmgをビルドできますか?
+
当社のテストではできませんでした。UbuntuのElectron Forgeは.debと.rpmしか作らず、macOSのパッケージを無理に作らせると失敗しました。macOS 26のrunnerでは、同じテンプレートからarm64とx64の.dmgと.zipができました。
ユニバーサルなMacのビルドを作るには?
+
Tauriでは、Rustのターゲットを両方追加し、tauri build --target universal-apple-darwinを実行します。当社ではこれで、x86_64とarm64を含む1つの.appができました。Electron Forgeでは、標準のテンプレートは統合に失敗したので、arm64とx64を別々にビルドしてください。
Appleの公証には、どのくらい時間がかかりますか?
+
Appleによると、たいてい1時間以内です。--waitフラグを付けると、Appleが答えるまでnotarytoolが待つので、自分で何度も確認する必要はありません。
1回のリリースのためのMacは、いくらかかりますか?
+
MacRunの1日パスは、Xcodeが入った専用のM6 Mac miniが$15です。1週間は$59です。支払いは1回だけで、自動更新はありません。