ガイド

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=ABCDE12345

Tauri:変数を設定してからビルド

次の変数を設定すると、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回だけで、自動更新はありません。

関連ガイド