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アカウントが必要である。

  1. App Store Connectにサインインし、「ユーザとアクセス」を開く
  2. 「統合」タブを開き、左のカラムで「App Store Connect API」を選ぶ
  3. 「チームキー」タブを選び、「APIキーを生成」または「+」を押す
  4. キーの名前を入力し、アクセスでDeveloperを選ぶ
  5. 「生成」を押す

キーの一覧に、キーの名前とKey IDが表示される。一覧の上部には、Issuer IDも表示される。

値形式notarytoolのオプション
Key ID通常10文字の英数字-d / --key-id
Issuer IDUUID-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の「ユーザとアクセス」の「統合」から実行する。