August 11, 2021

Apple の証明書IDが変わってビルドが失敗するようになっていた

プログラミング
build
apple
iOS

先日、Apple の証明書を更新したところ、CI で実行していたビルドが失敗するようになりました。

証明書とか provisioning profile をマシン上で更新するのに失敗したのかなと思ったのですが、そうでも無さそうで、しばらく悩んでいました。

実際に実行しているコマンド

実際に叩いているコマンドはこのような感じに、署名関係のパラメータをがっつり指定しています。

(この前段階で Unity のビルドが走っていて Xcode プロジェクトをはき出しますが、その後 Xcode のアーカイブ時には自動で探してくれるのでここで指定しなくても良いんじゃないか、という話もありますね)

% xcodebuild -project Unity-iPhone.xcodeproj\ 
clean\ 
archive\ 
-archivePath ./build/Unity-iPhone.xcarchive\ 
-scheme Unity-iPhone\ 
-configuration Release\ 
CODE_SIGN_IDENTITY='iPhone Distribution: XXXXXXX'\ 
PROVISIONING_PROFILE_SPECIFIER=xxxxxxxxxx\ 
DEVELOPMENT_TEAM=XXXXXXXXX

で、ここで、そんな証明書は見つかりませんよ、と言われてしまうわけです。

証明書を確認してみた

証明書の更新後にコードサイニングが通らないときに確認するのは、以下の2つかなと思います。

  • 古い provisioning profile が残っていないか
  • 証明書がロックされていないか

ついでなので少し触れると、

古い provisioning profile が残っていないか

新旧の provisioning profile があると、古い方を使ってしまうことがあるので、 ~/Library/MobileDevice/Provisioning Profiles の古い方を削除します。

個人的には全部削除して、全部登録し直すようにスクリプトを書いています。

証明書がロックされていないか。

CI でビルドが失敗して、実際にマシンを覗いてみると、パスワードのダイアログが出ていて入力待ち状態だったりします。

初回だけだと思ってうっかり手作業で 次回以降確認しない にチェック入れて確認してしまうと、更新後にこういう事態に陥るのでやめたほうが良いですね。
ビルドスクリプトで、
security unlock-keychain -p <PASSWORD> /path/to/xxx.keychain とやることが多いでしょうか。

あるいは、CI 専用のマシンに関しては、システムのキーチェーンに追加してアクセス制御をすべて許可してしまうという運用もあります。
手作業でもできますが、コマンドでセットアップするには、以下のような感じでできます。

sudo security import xxxxxxxxx.p12 -A -P <PASSWORD> -k /Library/Keychains/System.keychain

An image from Notion

原因: 証明書ID の prefix(?) が変わっていた

結局、上記の問題はなく、エラーの内容も特に目新しいものではなかったので、行き詰まってしまったのですが、ふと証明書のファイルを覗いてみると新旧で違いがあることに気が付きました。

新しい証明書(下の画像左)は iPhone Distribution: XXXXXXX なのに対し、

古い証明書(下の画像右)は Apple Distribution: XXXXXXX です。

An image from Notion

ということなので、冒頭のコマンドの

CODE_SIGN_IDENTITY='iPhone Distribution: XXXXXXX'\

の部分を

CODE_SIGN_IDENTITY='Apple Distribution: XXXXXXX'\

と変更すれば良かったのでした。

なぜ変わった?

なぜ変わったのというと、作成時に Apple Development で作成していたからでした。

An image from Notion

以前は Apple Development はなかったような気がするのですが、気のせいでしょうか。

Xcode 11 のリリースノートで「新しい証明書タイプをサポートした。前のバージョンは引き続き有効だけど、Xcode 11 で新しく作成すると新しい証明書タイプになるよ」と書いてあるので、このタイミングで Apple Development が作成できるようになったんでしょうか。

Xcode 11 supports the new Apple Development and Apple Distribution certificate types. These certificates support building, running, and distributing apps on any Apple platform. Preexisting iOS and macOS development and distribution certificates continue to work, however, new certificates you create in Xcode 11 use the new types. Previous versions of Xcode don’t support these certificates. (45527608)

証明書の更新は年に一度のことなので、原因にたどり着くまで時間がかかってしまいました。