iOS Certificate
Overview
iOSの証明書周りについてまとめたセクション。
証明書周りの説明と Apple Developer Certificates, Identifiers & Profiles についても詳細に記載
Apple Reference 証明書の概要
アプリリリースに必要な証明書手順(旧来の方法)
以下の方法は昔の方法で、今はXcodeでほとんど自動化できる。
ただ、仕組みは今でも同じなので作業の流れを理解しておくのは必要だと思われる
iOSのコード署名
iOSのコード署名と検証のプロセスにはProvisioning Profile(プロビジョニングプロファイル)というファイルが関わってくる。
プロビジョニングプロファイルはアプリIDと証明書が含まれたファイル。
アプリIDと証明書はAppleの開発者アカウントに紐付いている
Xcodeプロジェクトは以下の4つの設定項目があり、すべてが正しく設定されていなければアプリの署名は成功しない。
- Appleの開発者アカウント(Team ID)
- アプリID
- 証明書
- プロビジョニングプロファイル
管理の難しい秘密鍵
iOSのコード署名で管理が難しいのが秘密鍵。
証明書を発行したMacにのみ秘密鍵が存在し他のMacに移す際は証明書とともにエクスポートする必要がある。
秘密鍵を紛失した場合は、証明書を再発行する必要がある。
また証明書には有効期限があり、有効期限が切れた場合もまた再発行する必要がある。
これらの**管理の手間を軽減する手段としてクラウド管理対象証明書(Apple Managed Certificates)**というしくみが導入された。
秘密鍵や証明書はAppleが管理し、ビルド環境には必要ない。
任意の環境でビルドしたアプリのハッシュ値をAppleに送信し、署名情報を取得してアプリに署名するというしくみ

UDID (Unique Device IDentifier)
全てのiOS端末には、端末を一意に識別する UDID (Unique Device IDentifier) が付与されている。
端末のシアリル番号とは別で設定アプリにも表示されない端末固有値。
業務用アプリの開発に関わらなければ知る機会もない。
しかしアプリ開発に携わっていて開発中アプリをテスト用にAdHoc配布する場合、対象端末のUDIDを全て収集しなければならなくなる。
provisioning profile にUDIDを含めておく必要があるため。
AdHocアプリを動作させる端末候補の UDID は、あらかじめ収集しておかなければいけない。
Provisioning Profile(プロビジョニングプロファイル)
【iOS】 Provisioning Profile への理解を深める
Provisioning Profileは作成したアプリに対してアプリ開発者が署名するために必要なデータ。
Provisioning Profileには以下の情報が詰まっている。
- アプリのBundle ID(com.app.・・・みたいなアプリを特定する情報)
- 自分が持っていて開発に使っているiPhoneやiPadの実機デバイスの情報
- 自分のMacで生成した証明書
- アプリの用途(開発or配布)
CSR(Cert Signing Request:証明書署名要求)
Appleからアプリ開発許可書(証明書)を発行してもらうための申込書。
ローカルPCのキーチェーンにて作成できる。
ローカルPC情報(個人特定情報)を申込書に記載するイメージ。
作成時に内部的に以下作成してくれる。
- 公開鍵と秘密鍵
- 識別情報
- 署名
拡張子は.CertSigningRequest
ローカルCSRベースのデメリット
ローカルMacでCSRを作成して証明書を発行すると、その秘密鍵が発行元のMacに閉じてしまうため、CI環境(たとえばGitHub Actions)での署名・ビルドが困難になる。
これが従来の手動証明書管理のつらさ。
ローカルCSRベースのデメリット
- 秘密鍵がローカルMacに依存 → GitHub ActionsなどのCIでは使用不可
- p12エクスポート+Secrets管理が必要 → セキュリティ&メンテコスト増
- 証明書の有効期限切れ再発行などの定期メンテが必要
そのためAppleが2023年に提供開始したクラウド管理対象証明書(Cloud-managed Certificates) の選択を行う。
「ホストマシンに属さず、GitHub ActionsでAdHocにデプロイできるようにする」を実現するためのものです。
Cloud Managed Certificatesの特徴
| 項目 | 内容 |
|---|---|
| 秘密鍵の管理 | Appleが行う(ローカルに不要) |
| CSR作成 | 不要(Apple管理下で完結) |
| CI環境 | 任意のマシンでビルド可能(例:GitHub Actions) |
| 利用方法 | Xcode Cloud / Xcode 15 / xcodebuild コマンドで自動使用される |
GitHub Actions + Cloud Managed Certificates + AdHoc配信の流れ(理想形)
- Apple Developer Consoleで App ID, Provisioning Profile (AdHoc), Devices の登録
- Xcode 15 以降 / xcodebuild 使用(自動的に Cloud Cert が使われる)
- AdHoc用 .ipa のビルド & エクスポート
- S3 + manifest.plist に配置
- インストールリンク生成:itms-services://?action=download-manifest&url=...
クラウド管理対象証明書(Cloud Signing)
Appleが2023年に導入した仕組みで、Apple Developer Programのアカウント上で管理される証明書。
従来はP12ファイルや秘密鍵を自分たちで管理しないといけなかったけど、Appleに預けることで以下のようなメリットがある。
- 鍵の漏洩リスクが大幅に減る
- CI/CDツールに秘密鍵を登録しなくてもよい(Appleが管理するので)
Apple のクラウド管理対象証明書を利用することで、iOS アプリのコード署名において秘密鍵や証明書のローカル管理が不要になります。これは、証明書を発行した Mac にのみ存在する秘密鍵を他のビルド環境に移す手間や、証明書の有効期限切れ・紛失時の再発行といった課題を軽減できます。
クラウド管理対象証明書を使用すると、任意の環境でビルドしたアプリのハッシュ値を Apple に送信し、Apple 側で署名が行われる仕組みです。
この機能により、コード署名の管理が簡略化されるため、特定のビルド環境では Fastlane の cert や match を使わなくても署名が可能となる。
ただし、TestFlight や App Store へのアップロード、メタデータ管理などの目的で deliver や pilot のような Fastlane の機能は依然として有効。
そのためAppleが2023年に提供開始したクラウド管理対象証明書(Cloud-managed Certificates) の選択を行う。
「ホストマシンに属さず、GitHub ActionsでAdHocにデプロイできるようにする」を実現するためのものです。
Certificate(証明書)
Appleからアプリ開発許可されたという証明書。
CSRを用いて、Apple Developerに申請することで発行される。
この発行された証明書をDLすることでキーチェーンに保存され、先ほどのCSRと紐づき開発(実機build)が可能に。
ローカルPC情報が記載されたCSRと証明書はセットで初めて開発(実機build)が可能になるイメージ。
※正しくは、CSRを作成時に作成された秘密鍵と証明書を紐づけることで開発が可能に。以下、分かりやすいようにCSR(秘密鍵)と記載します。
シミュレーターなら証明書不要でbuildできる。
Certificate(証明書)には、主に以下2種類ある。
Development :開発用 Distribution :配信用 どちらもAppleからの開発許可証的な役割なので、仕組み基本は同じだが、どちらの証明書もチームに最大数が決まっていることに要注意。
運用としては、
組織の開発者各々がDevelopmentの証明書を作成して、Distributionの証明書は組織で管理共有。 fastlaneとかを使用する場合は、Developmentの証明書も両方とも組織で管理共有。 とかがよくあるパターンかと。 拡張子は.cer
ExportOptions.plist について
iOSアプリの .xcarchive から .ipa をエクスポートする際に使用する設定ファイルです。
xcodebuild -exportArchive コマンドで指定し、どのような方法でアプリを出力するかを制御します。
よく使われるキー
method: エクスポート方法(app-store,ad-hoc,enterprise,developmentなど)teamID: Apple Developer Team IDsigningStyle:automaticまたはmanual(コード署名のスタイル)provisioningProfiles: バンドルIDとプロファイルの対応(手動署名時)uploadSymbols: dSYMのアップロード有無(クラッシュログ用)compileBitcode: Bitcodeを有効にするか
使用例(plistファイル)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
<key>teamID</key>
<string>XXXXXXXXXX</string>
<key>uploadSymbols</key>
<true/>
<key>signingStyle</key>
<string>automatic</string>
</dict>
</plist>
実行例
xcodebuild -exportArchive \
-archivePath MyApp.xcarchive \
-exportOptionsPlist ExportOptions.plist \
-exportPath MyAppExport
Xcode Organizer経由で書き出す場合も、このファイルが自動生成される。 CI環境(例:GitHub Actions)でも静的に保持しておくと再現性のあるビルドが可能。

