Apple IDやApp用パスワードを使わずに、notarytoolで公証したい場合がある。App Store Connect APIキーを使うと、コマンドへApple IDを書かなくても公証できる。指定するのは、キーファイル(-k)、Key ID(-d)、Issuer ID(-i)の3つである。
$ xcrun notarytool submit [アプリ名].zip -k [AuthKey_XXXXXXXXXX.p8のパス] -d [Key ID] -i [Issuer ID] --wait
ここでは、APIキーの作成から、submitへの直接指定、store-credentialsへの保存までを紹介する。実行例はXcode 27.0に含まれるnotarytool 1.1.3のもの。
参考: 【notarytool】App用パスワードで公証用の認証情報を保存する
APIキーを作成する
APIキーは、App Store Connectで作成する。Teamキーの作成には、App Store ConnectのAdminアカウントが必要である。
- App Store Connectにサインインし、「ユーザとアクセス」を開く
- 「統合」タブを開き、左のカラムで「App Store Connect API」を選ぶ
- 「チームキー」タブを選び、「APIキーを生成」または「+」を押す
- キーの名前を入力し、アクセスで
Developerを選ぶ - 「生成」を押す
キーの一覧に、キーの名前とKey IDが表示される。一覧の上部には、Issuer IDも表示される。
| 値 | 形式 | notarytoolのオプション |
|---|---|---|
| Key ID | 通常10文字の英数字 | -d / --key-id |
| Issuer ID | UUID | -i / --issuer |
秘密鍵(AuthKey_[Key ID].p8) | ファイル | -k / --key |
秘密鍵の.p8ファイルは、キーの作成後に1回だけダウンロードできる。Appleは秘密鍵のコピーを保持しない。紛失した場合は、キーを失効させて作り直す。
アクセスにはDeveloperを選ぶ
アクセスにDeveloperを選んだキーで、submitがAcceptedになるところまで確認できた。Admin権限は不要である。
Apple公式ドキュメントには、公証に必要なロールの明記が見つからなかった。Developerで通ることは、このキーでの実測による。
submitにAPIキーを直接渡す
submitに、-k、-d、-iを指定する。
$ xcrun notarytool submit hello.zip -k ./AuthKey_[Key ID].p8 -d [Key ID] -i [Issuer ID] --wait
Conducting pre-submission checks for hello.zip and initiating connection to the Apple notary service...
Submission ID received
id: [提出ID]
Successfully uploaded file
id: [提出ID]
path: [hello.zipのパス]
Waiting for processing to complete.
Current status: In Progress...Current status: In Progress....Current status: Accepted.....Processing complete
id: [提出ID]
status: Accepted
Apple IDやTeam IDは指定していない。Apple公式のTN3147
によると、notarytoolはIssuer IDからApple IDを判断する。
-k、-d、-iは、submit以外のサブコマンドでも同じ形で指定できる。historyで認証だけを確認する場合は、次のようにする。
$ xcrun notarytool history -k ./AuthKey_[Key ID].p8 -d [Key ID] -i [Issuer ID]
Successfully received submission history.
history
--------------------------------------------------
...
Successfully received submission history.が表示されれば、認証は成功している。
認証情報をプロファイルに保存する
毎回3つのオプションを指定するのが面倒な場合は、store-credentialsでAPIキーをキーチェーンに保存する。保存後は、App用パスワードのプロファイルと同じく-p(--keychain-profile)にプロファイル名を指定する。
$ xcrun notarytool store-credentials "[プロファイル名]" -k ./AuthKey_[Key ID].p8 -d [Key ID] -i [Issuer ID]
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 "[プロファイル名]"`
App用パスワードのときと違い、パスワードの入力プロンプトは表示されない。保存前に認証が検証される点は同じである。
保存したプロファイルは、次のように使う。
$ xcrun notarytool history -p "[プロファイル名]"
Successfully received submission history.
...
保存後は.p8ファイルが不要になる
プロファイルの保存後に.p8ファイルを別のディレクトリへ移動しても、-pでの認証は成功した。キーチェーンには、.p8のパスではなく秘密鍵の内容が保存される。
.p8ファイルを移動したあとは、-kに元のパスを指定するとエラーになる。プロファイルを使う場合は、-kを指定しない。
保存後は、.p8ファイルを手元に残す必要性が下がる。ただし、別のマシンで同じキーを使う場合は、.p8ファイルが再び必要になる。
オプションを省略したときのエラー
指定するオプションの組み合わせによって、エラーの出方が異なる。実際に試した結果を示す。
-dか-kのどちらかを省略すると、notarytoolが引数の不足を検出して終了コード64で終了する。
$ xcrun notarytool history -k ./AuthKey_[Key ID].p8 -i [Issuer ID]
Must provide all App Store Connect API arguments for Team Keys (--key, --key-id, --issuer), and Individual Keys (--key, --key-id).
$ echo $?
64
-dを省略した場合と-kを省略した場合で、同じメッセージになる。
-kに存在しないファイルを指定した場合も、終了コード64で終了する。
$ xcrun notarytool history -k ./nonexistent.p8 -d [Key ID] -i [Issuer ID]
Error: The value './nonexistent.p8' is invalid for '-k <key>': The file couldn’t be opened because it doesn’t exist.
...
$ echo $?
64
-iだけを省略すると、引数の不足としては検出されない。個人用キーとして扱われ、Appleのサーバーに認証を拒否される。Teamキーに-iを指定しなかった場合のエラーである。
$ xcrun notarytool history -k ./AuthKey_[Key ID].p8 -d [Key ID]
Error: HTTP status code: 401. Unauthenticated. Ensure that all authentication arguments are correct.
$ echo $?
1
Key IDが誤っている場合も、同じ401エラーになる。401が返ったときは、-iを指定しているか、Key IDとIssuer IDの値が正しいかを確認する。
TeamキーとIndividualキーの違い
App Store Connect APIキーには、TeamキーとIndividualキー(個人用キー)の2種類がある。
| 種類 | アクセス | -i(Issuer ID) |
|---|---|---|
| Team | 選択したロールに基づく | 必須 |
| Individual | 紐づくユーザーのアクセスとロール | 指定しない |
notarytool store-credentials --helpには、Issuer IDは「Teamキーでは必須、Individualキーには指定しない」と書かれている。
一方、Apple Developer Forumsには、個人用キーはnotarytoolで使えないとする投稿がある。この記事では、Teamキーでのみ検証した。個人用キーで公証できるかは確認していない。notarytoolを使う場合は、Teamキーを作成する。
参考: Creating API Keys for App Store Connect API
参考: Notarization issue with keys (Apple Developer Forums)
.p8ファイルを保護する
.p8ファイルは、パスワードと同じ扱いの秘密情報である。次の点に注意する。
- ファイルの権限を
600にする - Gitリポジトリにコミットしない
- チャットやIssueに貼り付けない
- CIでは、リポジトリのSecretsに保存する
- 不要になったキーや漏えいが疑われるキーは、App Store Connectで失効させる
Key IDとIssuer IDは、.p8ファイルがなければ認証に使えない。ただし、これらも不要に公開しない。
キーの失効は、App Store Connectの「ユーザとアクセス」の「統合」から実行する。
