🔑

macOSのself-hosted runnerにおけるipa生成時の署名のトラップの話

2024/11/23に公開

みなさんご存知の通り、GitHub Actions のmacOS ランナーは高いため、自分でビルド用のマシンを用意して self-hosted runner として利用することは多々あると思います。

そういった環境で署名済みの ipa を export したい場合、Distribution 証明書と Provisioning Profile を GitHub Action の Secret に保存し、ワークフロー内でデコードして利用することが一般的です。

そんな時このエラーに遭遇したので、その解決方法を共有します。

Warning: unable to build chain to self-signed root for signer "Apple Distribution: Your Team (XXXXXXXXXX)"

環境

  • macOS Sequoia 15.1
  • Xcode 16.1

解決方法

まず結論ですが、ワークフローのクリーンアップでこのコマンドを実行しましょう。

security list-keychain -d user -s "login.keychain-db"

なぜこれで解決するのか

GitHub Actions への証明書の渡し方

まず前提として、署名された ipa を生成するためには Distribution 証明書と Provisioning Profile を GitHub Actions に渡す必要があります。

一般的には BASE64 にエンコードして GitHub Action の Secret に保存し、ワークフロー内でデコードして利用すると思います。
具体的な方法は公式がドキュメントを用意してくれているのでこちらをご覧ください。

詳細は省きますが、app-signing.keychain-db というカスタムキーチェーンを作成し、Distribution 証明書を保存しています。(Provisioning Profile は今回は気にする必要はありません)

security list-keychain -d user -s $KEYCHAIN_PATH の罠

前述の公式ドキュメントには、security list-keychain -d user -s $KEYCHAIN_PATH というコマンドを実行するように書かれています。

キーチェーンを深く理解していないので正確ではないかもしれませんが、要はアクティブにしていると理解しています。
このコマンドを実行した後キーチェーンアクセスを開くとapp-signingというカスタムキーチェーンが追加されていることが確認できます。
カスタムキーチェーンに入っている有効な証明書

ここで注目して欲しいのが、デフォルトキーチェーンにログインがありません!!!

デフォルトキーチェーン「ログイン」が無いとどうなるか

ログインが無い状態でカスタムキーチェーンapp-signingを作成する一連のスクリプトを実行すると、次の画像のようになります。

カスタムキーチェーンに入っている信頼されていない証明書

なんと証明書は信頼されていません!!!
どうやらルート認証局と中間認証局がないので、いわゆるオレオレ証明書として扱われているようです。

では冒頭のエラーメッセージをおさらいしますが、Distribution 証明書が信頼されていないことが原因です。

Warning: unable to build chain to self-signed root for signer "Apple Distribution: Your Team (XXXXXXXXXX)"

つまり、カスタムキーチェーンを作るときはデフォルトキーチェーン「ログイン」が存在している必要があります。

ログイン が存在する状態でカスタムキーチェーンをアクティブにしよう

はっきり言って理由はよく分かっていませんが、挙動としてはログインのキーチェーンからルート認証局と中間認証局を引っ張ってきているようなので、カスタムキーチェーンを作る前に security list-keychain -d user -s "login.keychain-db" を実行してログインのキーチェーンをアクティブにしましょう。

カスタムキーチェーンはまだ無い

そうすれば、カスタムキーチェーンに信頼された Distribution 証明書を追加することができます。

いつsecurity list-keychain -d user -s "login.keychain-db"を実行するのか

セルフホストランナーに必要なクリーンアップ - GitHub Docsのクリーンアップの中で実行するのが良いと思います。

最後に

この問題は初回のアーカイブ実行時には問題はありません。
なぜならデフォルトでログインはアクティブなので、カスタムキーチェーンにルート認証局と中間認証局が追加されるためです。

しかし 2 回目以降はログインが無い状態になるので、この問題が発生します。

GitHub のドキュメントにはログインをアクティブにしましょうといった記載はありません。
GitHub が用意している macOS ランナーのインスタンスは使い捨てなので、ログインが無くなろうが 2 回目は無いので気にしていないのかもしれません。

また self-hosted runner に詳しくなってしまった...

GitHubで編集を提案

Discussion