notarytool store-credentialsは、既定ではログインしているユーザーのkeychainに認証情報を保存する。CIの一時keychainに保存したい場合や、保存時のAppleへの認証確認を省きたい場合は、オプションで保存先と検証を指定できる。
$ xcrun notarytool store-credentials "[プロファイル名]" -k [AuthKey_XXXXXXXXXX.p8のパス] -d [Key ID] -i [Issuer ID] --keychain [keychainファイルのパス]
ここでは、--keychain、--sync、--validateと--no-validateの使い方を紹介する。実行例はXcode 27.0に含まれるnotarytool 1.1.3のもの。
参考: 【notarytool】App用パスワードで公証用の認証情報を保存する
既定の保存先
--keychainを指定しない場合、認証情報はdata protection keychainに保存される。Keychain Access.appでは、「iCloudキーチェーン」に表示される。iCloudキーチェーンが無効な場合は、「ローカル項目」に表示される。
保存した項目は、securityコマンドでは見つからない。削除方法は、別の記事で紹介している。
keychainファイルに保存する
CIでは、ログインユーザーのkeychainを使わず、ジョブごとに一時的なkeychainを作る場合がある。--keychainにkeychainファイルのパスを指定すると、そのファイルに認証情報を保存できる。
$ security create-keychain -p [keychainのパスワード] $PWD/notary.keychain-db
$ security unlock-keychain -p [keychainのパスワード] $PWD/notary.keychain-db
$ xcrun notarytool store-credentials "[プロファイル名]" -k [AuthKey_XXXXXXXXXX.p8のパス] -d [Key ID] -i [Issuer ID] --keychain $PWD/notary.keychain-db
...
Credentials saved to Keychain.
To use them, specify `--keychain-profile "[プロファイル名]" --keychain [notary.keychain-dbのフルパス]`
security create-keychainに相対パスを指定すると、keychainファイルはカレントディレクトリではなく~/Library/Keychains/に作られる。--keychainには存在するファイルのパスを指定するため、ここでは$PWDを使った絶対パスで指定している。
保存したプロファイルは、-pに加えて--keychainを指定して使う。--keychainを省略すると、既定の保存先から探すため、No Keychain password item found for profileのエラーで終了コード69になる。
$ xcrun notarytool history -p "[プロファイル名]" --keychain $PWD/notary.keychain-db
Successfully received submission history.
...
--keychainは、store-credentials以外のサブコマンドでも指定できる。指定したkeychainがロックされている場合は、パスワードの入力を求められる。
securityコマンドで項目を確認できる
keychainファイルの項目は、securityコマンドで確認できる。アカウントはcom.apple.gke.notary.tool.saved-creds.[プロファイル名]である。
$ security dump-keychain $PWD/notary.keychain-db | grep -E '^class|"acct"|"svce"'
class: "genp"
"acct"<blob>="com.apple.gke.notary.tool.saved-creds.[プロファイル名]"
"svce"<blob>="appStoreConnect"
svceは、APIキーを保存した場合はappStoreConnect、App用パスワードを保存した場合はappSpecificPasswordだった。
keychainファイルは、不要になったらsecurity delete-keychainで削除する。
$ security delete-keychain $PWD/notary.keychain-db
--syncで他のデバイスと同期する
--syncを指定すると、プロファイルをiCloudキーチェーンで他のデバイスと同期する設定で保存する。--helpには、iCloudキーチェーンが無効な場合は「ローカル項目」のkeychainを使うと書かれている。
$ xcrun notarytool store-credentials "[プロファイル名]" --apple-id [Apple ID] --team-id [Team ID] --sync
--keychainとは同時に指定できない
--syncと--keychainを同時に指定すると、エラーになる。
$ xcrun notarytool store-credentials "[プロファイル名]" --apple-id [Apple ID] --team-id [Team ID] --sync --keychain $PWD/notary.keychain-db
Error: --sync and --keychain are mutually exclusive options. Only one may be used.
$ echo $?
1
エラーになった場合、認証情報はどこにも保存されない。指定したkeychainファイルが存在しない場合は、この確認より先に、ファイルが存在しないエラー(終了コード64)になる。
--syncの有無による表示の違い
iCloudキーチェーンが有効な環境で、--syncを指定した場合と指定しない場合を比べた。どちらの項目も、Keychain Access.appの「iCloudキーチェーン」に表示された。項目の種類と場所の表示にも、違いは見つからなかった。
--no-validateで保存前の検証を省く
store-credentialsは、既定では保存前にAppleのサーバーに認証できるかを検証する(--validate)。検証に失敗すると、認証情報は保存されない。
$ xcrun notarytool store-credentials "[プロファイル名]" --apple-id [Apple ID] --team-id [Team ID] --password [誤ったパスワード]
Error: HTTP status code: 401. Invalid credentials. Username or password is incorrect. Use the app-specific password generated at appleid.apple.com. Ensure that all authentication arguments are correct.
This process stores your credentials securely in the Keychain. You reference these credentials later using a profile name.
Validating your credentials...
$ echo $?
1
--no-validateを指定すると、検証を省いて保存する。
$ xcrun notarytool store-credentials "[プロファイル名]" --apple-id [Apple ID] --team-id [Team ID] --password [パスワード] --no-validate
...
Skipping credential validation
Credentials saved to Keychain.
To use them, specify `--keychain-profile "[プロファイル名]"`
Skipping credential validationと表示され、認証情報の正しさに関係なく保存される。誤った認証情報も保存されるため、認証エラーは、保存したプロファイルを使う時点で発生する。
$ xcrun notarytool history -p "[プロファイル名]"
Error: HTTP status code: 401. Invalid credentials. Username or password is incorrect. Use the app-specific password generated at appleid.apple.com. Ensure that all authentication arguments are correct.
--no-validateは、保存する時点でAppleのサーバーに接続できない環境で、認証情報を先に保存しておきたい場合に使う。認証情報が正しいと確信できる場合に限る。
同じプロファイル名で保存し直す
同じプロファイル名で、同じ種類の認証情報を保存し直すと、項目は更新される。項目は増えない。
同じプロファイル名で、App用パスワードとAPIキーのように種類が違う認証情報を保存すると、別々の項目として共存する。svceがappSpecificPasswordの項目とappStoreConnectの項目が、同じアカウントで2つ並ぶ。
$ security dump-keychain $PWD/notary.keychain-db | grep -E '^class|"acct"|"svce"'
class: "genp"
"acct"<blob>="com.apple.gke.notary.tool.saved-creds.[プロファイル名]"
"svce"<blob>="appSpecificPassword"
class: "genp"
"acct"<blob>="com.apple.gke.notary.tool.saved-creds.[プロファイル名]"
"svce"<blob>="appStoreConnect"
この状態で-pにプロファイル名を指定すると、App用パスワードの項目が使われた。APIキーを後から保存しても、APIキーに切り替わるわけではない。プロファイルの認証方式を変える場合は、別のプロファイル名で保存する。
