Mac App Store以外で配布するMacアプリ、コマンドラインツール、Kextなどの安全性を担保する仕組みとして、macOSには公証(Notarize)があります。公証はApple Notary Serviceに開発したプログラムが開発者が登録し、ユーザーがそのプログラムを起動しようとすると、macOSが自動的に登録されているかをチェックし、登録されていなければ起動しないようにブロックします。
公証については、こちらの記事でも解説しています。
公証はXcodeを使う方法とnotarytoolを使う方法があります。Xcodeを使う方法はGUIで操作できる方法です。分かりやすいのですが、自分で操作する必要があり、CI/CD経由やスクリプトなどで自動化することができません。
notarytoolはコマンドラインユーティリティです。ターミナルから自分で実行することもできますし、CI/CD経由やスクリプトなどで自動化するときなどにも使用可能です。
コマンドラインユーティリティを使う方法には、altoolを使う方法もありました。しかし、altoolを使う方法は廃止されることになりました。2023年11月1日以降は、notarytool、もしくはXcode 14以降を使用する必要があります。
この記事ではnotarytoolを使って公証を行う方法について解説します。
全体の流れ
notarytoolを使って公証を行うには、以下の事前準備が必要です。
- チームIDを調べる。
- Apple IDの2ファクタ認証を設定する。
- キーチェーンにアカウント情報を記憶させる。
3については、notarytoolを使用するマシンで行う必要があります。公証の手順は以下の通りです。
- 公証するアプリでHardened Runtimeを有効化するか、Sandboxを有効化する。
- Developer ID Application証明書でコードサイニングを行う。
- notarytoolでアップロードする。
- notarytoolを使ってStapleを行う。
チームIDを調べる
notarytoolは認証情報ごとにプロファイルを作成して、キーチェーンに保存します。プロファイルはデベロッパーチーム単位で作成します。業務委託の場合には使用するデベロッパーアカウントが、複数のデベロッパーチームに属しているということがあるでしょう。その場合はプロファイルも複数となります。
プロファイル作成時にチームIDを指定するので、チームIDを確認しておきましょう。チームIDはApple Developerサイトのアカウントページで確認できます。
- Apple Developerサイトのアカウントページにサインインします。
- 右上のリンクからデベロッパーチームを選択します。
- 「メンバーシップの詳細」をクリックします。
- 「チームID」にデベロッパーチームのチームIDが表示されます。
Apple IDの2ファクタ認証のアプリ用パスワードを発行する
デベロッパーアカウントで使用するApple IDは2ファクタ認証が必須化されています。notarytoolで2ファクタ認証が有効化されているアカウントを使用するために、アプリ用パスワードが必要です。Apple IDのアプリ用パスワードを発行する方法については、次の記事をご覧ください。
キーチェーンにプロファイルを追加する
notarytoolが使用する認証情報を入れたプロファイルをキーチェーンに追加します。ターミナルで次のように入力します。
xcrun notarytool store-credentials "AC_PASSWORD" --apple-id "[email protected]" --team-id TEAMID --password examplepassword
AC_PASSWORD
はプロファイル名です。任意の名称を使用可能です。複数のデベロッパーチームに属している場合には、プロファイル名で使い分けるので、分かりやすい名称にしましょう。
[email protected]
はデベロッパーカウントのApple ID、TEAMID
はデベロッパーチームID、examplepassword
はアプリ用パスワードに置き換えてください。
次のように表示されたら成功です。
This process stores your credentials securely in the Keychain. You reference these credentials later using a profile name.
Validating your credentials...
Success. Credentials validated.
Credentials saved to Keychain.
To use them, specify `--keychain-profile "AC_PASSWORD"`
キーチェーンアクセスで表示する
キーチェーンアクセスでプロファイルを探すと、com.apple.gke.notary.tool
という名前で保存されました。AC_PASSWORD
という名前のプロファイルのアカウントはcom.apple.gke.notary.tool.saved-creds.AC_PASSWORD
という名前になっていました。末尾にプロファイル名が付いているので、複数登録していても見分けられます。
公証するアプリの設定
公証するアプリはSandbox対応にするか、Hardened Runtimeを有効化する必要があります。Sandbox対応は各アプリ毎にホームフォルダが割り当てられ、他のアプリのファイルにはアクセスできなくなり、システムの重要な領域にはアクセスできなくなります。
アプリの機能がSandbox内でも実現できる場合には、Sandbox対応にするのが望ましいと思います。しかし、Sandbox化すると実現できない機能を実装する必要があるときも多いです。そのようなときに有効化するのがHardened Runtimeです。
Hardened Runtimeは特定の脆弱性を防ぐことで実行時のプログラムの整合性を保護する仕組みです。実行中のプログラムを外部から改ざんされることを防ぎます。Hardened Runtimeを有効化してもほとんどのプログラムは影響を受けないのですが、JIT (Just In Time Compiler)など一部のプログラムは影響を受けます。エンタイトルメントで無効化されてしまうこれらの機能を有効化することも可能ですが、その機能に依存していて、必須であるときに限定して許可してください。
ビルド設定については、次の記事をご覧ください。
アップロードするディスクイメージの作成
トラブルが少なく、ややこしいことが起きないのは、ディスクイメージ(dmg, UDIFフォーマット)にしてアップロードする方法です。ディスクユーティリティで普通に作成したディスクイメージで問題ありません。
インストーラ形式(pkg)の場合は、フラットパッケージ形式を使用する必要があります。mpkgは使用できません。
インストーラの作成方法については次の記事をご覧ください。
アップロードする
Apple Notary Serviceにアップロードするには次のように実行します。
xcrun notarytool submit MyApp.dmg --keychain-profile "AC_PASSWORD" --wait
--wait
を指定すると公証の結果が出るまで待機します。フリーズしたのかと思うくらい時間がかかります。アプリの規模にもよりますが、数分から20分くらいは時間がかかります。
成功するとAccepted
と出力されます。
Stapleを行う
オフラインでも公証されていることを認識するための情報を埋め込むのがStapleです。公証に成功したら次のように実行して、Stapleを行います。
xcrun stapler staple "MyApp.dmg"
まとめ
notarytoolを使った公証は、この記事で紹介したとおり、単純なコマンドを実行するだけです。
notarytoolに移行すると、`–wait`オプションが使えて、公証結果が出るまで待機するというのが簡単になったので、スクリプト化するときに楽だと思います。以前は発行されたUUIDを使って定期的に問い合わせして、作業中なのか、成功したのかを調べにいく必要がありました。
既にaltoolが使用可能な期限は過ぎています。notarytoolを使った方法に移行する必要があります。