Fastlane match 証明書期限切れ:突然のビルド障害を確実に復旧する手順
結論:fastlane match nuke で古い証明書を消して再生成するだけ
Fastlane match が管理する証明書の有効期限が切れると、CI/CD パイプラインが突然落ちて焦ることがある。結論から言えば、期限切れ証明書を match nuke で削除し、fastlane match を再実行すれば新しい証明書が自動発行されて Git リポジトリへの保存まで一気に完了する。
ただし手順を間違えると Git リポジトリが汚れたり、チームメンバーの環境が壊れたりする。以下の手順を正確に踏んでほしい。
症状を確認する:どんなエラーが出るか
証明書が切れると、ビルド時に次のようなエラーが出る。
error: No signing certificate "iOS Distribution" found:
No "iOS Distribution" signing certificate matching team ID "XXXXXXXXXX"
with a private key was found.
match 実行中には:
[!] Your certificate 'XXXXXXXXXXX.cer' is not valid,
please check end date and renew it if necessary
Xcode の Signing 設定に「Certificate Expired」と赤く表示される場合も同様。まず闇雲に操作せず、本当に証明書が原因か確認する。
事前確認:期限切れ証明書かどうかを診断する
① Keychain で有効期限を確認
security find-certificate -a -p \
| openssl x509 -noout -dates 2>/dev/null \
| grep -E "notAfter"
② match のドライランで確認
fastlane match appstore --readonly --verbose
--readonly を付けると証明書の取得だけを行い、作成・上書きはしない。ログに期限切れの情報が表示される。
③ App Store Connect で目視確認
[Certificates, Identifiers & Profiles] を開き、期限切れマークが付いた証明書を探す。match の Git リポジトリと Apple Developer Portal の状態が食い違っていると、再発行後もエラーが出続けることがあるため、必ず両方を確認する。
復旧手順:step by step
Step 1. match リポジトリをバックアップ(任意だが推奨)
git clone <match-repo-url> match-backup-$(date +%Y%m%d)
Step 2. match nuke で期限切れ証明書を削除
match nuke は Apple Developer Portal と match の Git リポジトリから証明書を同時に削除するコマンド。チーム全員のビルドに影響するため、実行前に必ず告知すること。
# Distribution 証明書のみ削除
fastlane match nuke distribution
# Development 証明書も削除する場合
fastlane match nuke development
注意:
nukeはプロビジョニングプロファイルも一緒に削除する。App Store Connect で手動作成したプロファイルも巻き込まれるため、確認してから実行する。
Step 3. 新しい証明書を再発行
fastlane match appstore
# または
fastlane match development
新しい証明書が Apple Developer Portal で発行され、暗号化されて match の Git リポジトリに push される。
--force オプションについて:nuke せず既存証明書を残したまま強制再生成したい場合は --force を使える。ただし期限切れ証明書が残存するため、nuke → 再生成 のほうが確実。
Step 4. CI/CD 環境を確認する
GitHub Actions などの CI 環境では、match が Git リポジトリへアクセスするための認証情報(SSH キーや MATCH_PASSWORD)が環境変数に設定されているはず。証明書の再発行後に環境変数の変更は不要だが、setup_ci の呼び出しを Fastfile に入れているか確認する。
lane :build do
setup_ci if ENV["CI"] # CI 専用の一時 Keychain を作成
match(type: "appstore", readonly: true)
gym(scheme: "MyApp")
end
setup_ci を省略すると、ローカルでは通るのに CI だけ失敗する症状が出やすい。
Step 5. チームメンバーが再同期する
fastlane match appstore --readonly
全メンバーがこれを実行して新しい証明書を Keychain に取得するまで、各自のローカルビルドは壊れたままになる。周知を忘れずに。
対処方法の比較
| 方法 | 手軽さ | リスク | 推奨場面 |
|---|---|---|---|
match nuke → 再生成 | やや手間 | 低(手順通りなら安全) | 基本の対処法 |
--force で強制再生成 | 手軽 | 中(古い証明書が残る) | 急ぎの場合のみ |
| App Store Connect で手動発行 | 手間大 | 高(match との整合性が崩れる) | 非推奨 |
App Store Connect を手動操作すると match との整合性が崩れて二次被害が出やすい。操作は必ず match 経由で統一するのが鉄則。
再発防止:証明書の有効期限を仕組みで監視する
Apple の証明書は 1年で期限切れになる。突然のビルド障害を防ぐには定期的な更新を CI のスケジュールジョブに組み込んでおくのが一番楽だ。
# GitHub Actions で月次実行する例
on:
schedule:
- cron: '0 9 1 * *' # 毎月1日 9:00 UTC
jobs:
renew-certs:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- run: bundle exec fastlane match appstore
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_AUTH }}
--readonly を外して実行すると、期限が近い証明書を自動更新してくれる。Slack 通知と組み合わせると気づきやすい。
よくあるハマりポイント
Q. nuke したのに App Store Connect に古い証明書が残っている
→ Developer Portal の API 反映に数分かかることがある。しばらく待ってリロードすること。
Q. MATCH_PASSWORD を紛失した
→ ローカルの環境変数や CI の Secrets を確認する。完全に紛失した場合は nuke でリポジトリをリセットし、match init で新しいパスワードを設定するしかない。MATCH_PASSWORD は 1Password などのパスワードマネージャーで必ず管理すること。
Q. ローカルは通るが CI だけ失敗する
→ setup_ci の呼び忘れか、Keychain のロック解除パスワードが違う可能性が高い。Fastfile の setup_ci 呼び出し位置と CI の環境変数を確認する。
まとめ
Fastlane match の証明書期限切れは nuke → 再生成 の手順を踏めば確実に復旧できる。焦って App Store Connect を手動操作するのが最大の落とし穴で、match との整合性が崩れて二次被害に発展しやすい。
定期的な証明書更新を CI のスケジュールジョブに組み込んでおけば、ほぼ再発しない。Fastlane の活用法を体系的に学びたいなら {{AMAZON:iOSアプリ開発 自動化レシピ|Fastlane・CI/CD・署名まわりを体系的に解説}} も参考になる。証明書の有効期限ポリシーや料金は変更される可能性があるため、最新情報は必ず Apple Developer の公式ドキュメント で確認してほしい。