【iOS/Xcode】Fastlane matchで証明書(Certificates)等の自動管理

この記事からわかること
- iOS/Xcodeの自動化ツール:Fastlaneの導入方法と使い方
- Fastlane matchの使い方
- 証明書(Certificates)やプロビジョニングプロファイルの自動管理
index
[open]
\ アプリをリリースしました /
環境
- Xcode:16.3
- iOS:18.4
- Swift:6
- macOS:Sequoia 15.4
- fastlane:2.228.0
Fastlane自体については以下の記事を参考にしてください。
Fastlane matchとは?
fastlane match
とはiOSアプリの署名に関わる証明書(Certificates)やプロビジョニングプロファイルの管理を自動化するためのツールです。個人開発の場合は自動署名機能(Automatically manage signing)などがあるのでそれほど使うことはないですがチームでの開発やCI/CDとの統合がある場合に複雑化しがちな証明書(Certificates)やプロビジョニングプロファイルの管理を一括で請け負ってくれます。
fastlane matchでできること
- 証明書(Certificates)の生成・管理
- プロビジョニングプロファイルの生成・管理
- リポジトリ(例:GitHub)に暗号化して保存
- キーチェーンに自動で証明書をインストール
- ローカル(※)に自動でプロビジョニングプロファイルをダウンロード
- 複数人・複数マシン間での署名情報の一元管理
- 開発・本番(App Store)・AdHoc など環境別に管理
※ 自動生成されたプロビジョニングプロファイルは~/Library/MobileDevice/Provisioning Profiles/
の中にダウンロードされます。これは「Automatically manage signing」を使用して生成した場合と同じ保管場所になります。
既存プロジェクトへのfastlane matchの導入
既存のプロジェクトへfastlane match
を導入してみたいと思います。
- 証明書管理用の空のリポジトリの作成
- fastlane自体の導入
- fastlane matchのセットアップ
- 各環境の証明書/プロビジョニングプロファイルの自動生成
1.証明書管理用の空のリポジトリの作成
まずは証明書を管理するための空のリポジトリを用意します。今回はGitHub上に用意したいので手動でprivateなリポジトリを作成しておいてください。リポジトリ名に指定はないですがcertificates
とつけておくとわかりやすいです。
2.fastlane自体の導入
まずはfastlane自体を導入する必要があるのでプロジェクトルートでfastlane init
コマンドを実行します。詳細な導入手順はこちらを参考にしてください。
$ bundle exec fastlane init
What would you like to use fastlane for?
1. 📸 Automate screenshots
2. 👩✈️ Automate beta distribution to TestFlight
3. 🚀 Automate App Store distribution
4. 🛠 Manual setup - manually setup your project to automate your tasks
3
を選択して自動でセットアップしてもらうと楽です。
3.fastlane matchのセットアップ
続いてfastlane match init
コマンドを実行します。すると管理先にストレージを問われるので1.git
を選択して次へ進みます。
$ bundle exec fastlane match init
fastlane match supports multiple storage modes, please select the one you want to use:
1. git
2. google_cloud
3. s3
4. gitlab_secure_files
privateなGitリポジトリを作ることをお願いされ、そのURLを問われるので先ほど作成しておいたリポジトリのURLを入力します。
Please create a new, private git repository to store the certificates and profiles there
URL of the Git Repo:[リポジトリのURL]
完了すると./fastlane/Matchfile
が生成されます。URLを間違えてしまっていた場合はこのファイル内のURLを修正すればOKです。
git_url("https://github.com/USERNAME/certificates.git")
storage_mode("git")
type("development")
4.各環境の証明書/プロビジョニングプロファイルの自動生成
証明書/プロビジョニングプロファイルを自動生成するにはfastlane match [環境]
コマンドを実行します。開発環境ならdevelopment
、本番環境ならappstore
になります。実行するとmatch
用のパスワードの入力を求められます。これはチーム間で共有するものになるので個人的なものは使わないようにしてください。
$ bundle exec fastlane match development
// match用のパスフレーズを入力
Passphrase for Match storage:**********
パスワードを入力して進めるとGitリポジトリに自動でディレクトリと暗号化された証明書やプロビジョニングプロファイルが生成されます。またローカル側ではキーチェーンに証明書をインストールし、~/Library/MobileDevice/Provisioning Profiles/[UUID].mobileprovision
のような形でプロビジョニングプロファイルもダウンロードされます。

他の開発者メンバーがmatchでプロビジョニングプロファイルを取得する
チーム内の他の開発者メンバーがリポジトリに生成しているプロビジョニングプロファイルを取得するためにはターミナルでfastlane match
コマンドを実行します。取得したいだけの場合は--readonly
オプションを付与することでApp Store Portalへのアクセスを省略(新規作成や更新をしないように)することができます。開発メンバーには意図せず更新されないように--readonly
オプションを使用することをルール化しておいた方が良いです。
$ fastlane match development --readonly
この際に指定したパスフレーズの入力を求められます。パスワード自体はそのまま共有するかfastlaneで読み込む用の.env
ファイルにMATCH_PASSWORD
に記載しておき、このファイルを共有する方法でもOKです。
MATCH_PASSWORD=パスフレーズ
またターミナルからのコマンド実行でも可能ではありますが--readonly
オプションの付け忘れなどもあるので後述しているFastlaneのレーンに記載する方法のはおすすめです。
Xcodeからビルドする
あまりないとは思いますが、ローカルにプロビジョニングプロファイルが取得できていればXcode側と自動で紐づいているのでプロビジョニングプロファイルを選択する箇所にmatch 環境 com.XXX.XXXXX
と表示されるようになります。これを選択することでXcodeからも問題なくビルドができるようになっていると思います。
Fastlaneのレーンでmatchアクションを使用する
Fastlaneのレーンではmatch
アクションを使用することで未生成であれば自動生成・生成済みであれば取得処理を行うことができます。match
アクションの引数type
に取得したい環境名を指定します。
# 開発用プロビジョニングプロファイルを取得する
desc "Fetch development provisioning profiles and certificates for code signing"
lane :fetch_dev_signing do
# プロビジョニングプロファイルの取得
match(
# development or appstore or adhoc
type: "development"
)
end
上記の場合だと証明書類のインストールの前に以下のように2ファクタ認証が必要になってしまいます。
Verifying that the certificate and profile are still valid on the Dev Portal...
Available session is not valid anymore. Continuing with normal login.
Two-factor Authentication (6 digits code) is enabled for account 'XXXXXXX@gmail.com'
More information about Two-factor Authentication: https://support.apple.com/en-us/HT204915
Please enter the 6 digit code:
App Store Connect API Keyを使用する
2ファクタ認証が必須になってしまうとチームでの開発に影響が出てしまうのでApp Store Connect API Keyを使用して認証する方式にすることで2ファクタ認証が不要になります。
作業として必要になるのは「App Store Connect APIキー(.p8ファイル)」の取得とAPIキーによる認証の実装です。作業としては以下の記事でまとめている部分と同じなので詳細は以下の記事を参考にしてください。
おすすめ記事:App Store Connect APIキーの取得
手順だけ紹介すると以下の通りです。
- App Store Connect APIキー(.p8ファイル)の生成とダウンロード
- fastlaneと同階層にキーを設置
- .envファイルを作成し、中に必要な情報を記載
- app_store_connect_api_keyアクションで認証(JWTの作成)
.envには以下のようにそれぞれの情報を記載します。
TEAM_ID=XXXXXXXXXX
KEY_ID=XXXXXXXXXX
ISSUER_ID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX
KEY_FILE_PATH=AuthKey_XXXXXXXXXX.p8 # AuthKey_XXXXXXXXXX.p8ファイルへのパス
# ↑ このパスはfastlaneディレクトリから見た位置を指定する
レーン内にapp_store_connect_api_key
アクションでキーによる認証を実装し引数api_key
に渡してあげればOKです。
# 開発用プロビジョニングプロファイルを取得する
desc "Fetch development provisioning profiles and certificates for code signing"
lane :fetch_dev_signing do
# 認証(JWTの生成)
api_key = app_store_connect_api_key(
key_id: ENV['KEY_ID'],
issuer_id: ENV['ISSUER_ID'],
key_filepath: ENV['KEY_FILE_PATH']
)
# プロビジョニングプロファイルの取得
match(
api_key: api_key,
# development or appstore or adhoc
type: "development"
)
end
ちなみにAPI Keyを使用してmatchを実行した際にプロビジョニングプロファイルが存在せず、自動生成されるとApp Store Portalから確認できる作成者がAPI Key:XXX...
となります。
開発者メンバーと管理者で分ける
match
アクションではApp Store Portalにデバイスが新規登録された場合にそれを検知して自動で再生成するforce_for_new_devicesオプションがあります。force_for_new_devices
オプションは開発者メンバー誰でもというより管理者だけが実行するような仕組みしておいた方が安全ではあるので管理者用と開発者メンバー用でレーンを分けてあげると良いかもしれません。開発者メンバーにはreadonly
をつけてあげればOKです。
# 管理者用:新しいデバイス追加後の再生成を許可
desc "Sync and regenerate development profiles with new devices (admin use)"
lane :sync_dev_signing_admin do
api_key = app_store_connect_api_key(
key_id: ENV['KEY_ID'],
issuer_id: ENV['ISSUER_ID'],
key_filepath: ENV['KEY_FILE_PATH']
)
match(
api_key: api_key,
type: "development",
# 新しいデバイスがある場合に自動で再生成
force_for_new_devices: true
)
end
# 開発者が既存の証明書・プロビジョニングを取得する専用
desc "Fetch development provisioning profiles (read-only mode) for local use"
lane :fetch_dev_signing_readonly do
api_key = app_store_connect_api_key(
key_id: ENV['KEY_ID'],
issuer_id: ENV['ISSUER_ID'],
key_filepath: ENV['KEY_FILE_PATH']
)
match(
api_key: api_key,
type: "development",
# Apple Developer Portal に書き込まない
readonly: true
)
end
またCI/CD上から動作させる場合もreadonly
を付与したmatch
を使うようにすることが公式から推奨されています。
パスフレーズを変更する
パスフレーズを変更したい場合はchange_password
コマンドを実行します。これを実行すると開発者全員に影響があるので慎重に行ってください。
$ fastlane match change_password
プロビジョニングプロファイルを削除する
fastlane match nuke
コマンドを使用することでApp Store PortalとGitHubリポジトリで管理しているプロビジョニングプロファイルを削除することができます。基本的にこのコマンドを使用するのは期限切れなどの場合かと思いますが、使い方を間違えると全てのプロビジョニングプロファイルが削除されてしまったりするので注意してください。使い方は簡単でnuke [type]
を指定するだけです。
$ fastlane match nuke development
コマンドを実行すると削除対象の証明書がリストで表示されます。この証明書に紐づくプロビジョニングプロファイルも一緒に削除されるようになります。
// 〜〜〜〜〜〜〜〜+---------------------------------------------------------------+
| Certificates that can be revoked |
+--------+--------------+------------+-------------+------------+
| Option | Name | ID | Type | Expires |
+--------+--------------+------------+-------------+------------+
| 1 | Apple | XXXXXXXXXX | Certificate | 2026-05-14 |
| | Development | | | |
| | : XXXXXXXXXX | | | |
| | XXXXXXXXXX | | | |
| 2 | Apple | XXXXXXXXXX | Certificate | 2026-06-28 |
| | Development | | | |
| | : XXXXXXXXXX | | | |
| | XXXXXXXXXX | | | |
+--------+--------------+------------+-------------+------------+
// デフォルトでは、リストされているすべての証明書とプロファイルが削除されます。
By default, all listed certificates and profiles will be nuked
// 特定の証明書とそれに関連付けられたプロファイルのみを削除しますか?(y/n)
Do you want to only nuke specific certificates and their associated
profiles? (y/n)
最初の質問ではy
を選択してください。n
は全て削除してしまうので注意してください。y
で進むと削除対象の証明書を番号で選択できます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。