Skip to main content

iOS Certificate

Overview

iOSの証明書周りについてまとめたセクション。
証明書周りの説明と Apple Developer Certificates, Identifiers & Profiles についても詳細に記載 Apple Reference 証明書の概要

アプリリリースに必要な証明書手順(旧来の方法)

以下の方法は昔の方法で、今はXcodeでほとんど自動化できる。
ただ、仕組みは今でも同じなので作業の流れを理解しておくのは必要だと思われる

Image from Gyazo
Image from Gyazo

iOSのコード署名

iOSのコード署名と検証のプロセスにはProvisioning Profile(プロビジョニングプロファイル)というファイルが関わってくる。
プロビジョニングプロファイルは
アプリIDと証明書
が含まれたファイル。
アプリIDと証明書はAppleの開発者アカウントに紐付いている

Xcodeプロジェクトは以下の4つの設定項目があり、すべてが正しく設定されていなければアプリの署名は成功しない。

  • Appleの開発者アカウント(Team ID)
  • アプリID
  • 証明書
  • プロビジョニングプロファイル
tip

管理の難しい秘密鍵

iOSのコード署名で管理が難しいのが秘密鍵。
証明書を発行したMacにのみ秘密鍵が存在し他のMacに移す際は証明書とともにエクスポートする必要がある。
秘密鍵を紛失した場合は、証明書を再発行する必要がある。
また証明書には有効期限があり、有効期限が切れた場合もまた再発行する必要がある。
これらの**管理の手間を軽減する手段としてクラウド管理対象証明書(Apple Managed Certificates)**というしくみが導入された。
秘密鍵や証明書はAppleが管理し、ビルド環境には必要ない。
任意の環境でビルドしたアプリのハッシュ値をAppleに送信し、署名情報を取得してアプリに署名するというしくみ
Image from Gyazo

UDID (Unique Device IDentifier)

iPhoneやiPadのUDIDを調べる方法 全10種

全てのiOS端末には、端末を一意に識別する UDID (Unique Device IDentifier) が付与されている。
端末のシアリル番号とは別で設定アプリにも表示されない端末固有値。
業務用アプリの開発に関わらなければ知る機会もない。

しかしアプリ開発に携わっていて開発中アプリをテスト用にAdHoc配布する場合、対象端末のUDIDを全て収集しなければならなくなる。
provisioning profile にUDIDを含めておく必要があるため。

tip

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情報(個人特定情報)を申込書に記載するイメージ。 作成時に内部的に以下作成してくれる。

  • 公開鍵と秘密鍵
  • 識別情報
  • 署名
tip

拡張子は.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配信の流れ(理想形)

  1. Apple Developer Consoleで App ID, Provisioning Profile (AdHoc), Devices の登録
  2. Xcode 15 以降 / xcodebuild 使用(自動的に Cloud Cert が使われる)
  3. AdHoc用 .ipa のビルド & エクスポート
  4. S3 + manifest.plist に配置
  5. インストールリンク生成:itms-services://?action=download-manifest&url=...

クラウド管理対象証明書(Cloud Signing)

Cloud-managed certificates

Appleが2023年に導入した仕組みで、Apple Developer Programのアカウント上で管理される証明書。
従来はP12ファイルや秘密鍵を自分たちで管理しないといけなかったけど、Appleに預けることで以下のようなメリットがある。

  • 鍵の漏洩リスクが大幅に減る
  • CI/CDツールに秘密鍵を登録しなくてもよい(Appleが管理するので)

Apple のクラウド管理対象証明書を利用することで、iOS アプリのコード署名において秘密鍵や証明書のローカル管理が不要になります。これは、証明書を発行した Mac にのみ存在する秘密鍵を他のビルド環境に移す手間や、証明書の有効期限切れ・紛失時の再発行といった課題を軽減できます。

クラウド管理対象証明書を使用すると、任意の環境でビルドしたアプリのハッシュ値を Apple に送信し、Apple 側で署名が行われる仕組みです。

この機能により、コード署名の管理が簡略化されるため、特定のビルド環境では Fastlane の certmatch を使わなくても署名が可能となる。
ただし、TestFlight や App Store へのアップロード、メタデータ管理などの目的で deliverpilot のような Fastlane の機能は依然として有効。

tip

そのためAppleが2023年に提供開始したクラウド管理対象証明書(Cloud-managed Certificates) の選択を行う。
「ホストマシンに属さず、GitHub ActionsでAdHocにデプロイできるようにする」を実現するためのものです。

Certificate(証明書)

Appleからアプリ開発許可されたという証明書。
CSRを用いて、Apple Developerに申請することで発行される。
この発行された証明書をDLすることでキーチェーンに保存され、先ほどのCSRと紐づき開発(実機build)が可能に。

ローカルPC情報が記載されたCSRと証明書はセットで初めて開発(実機build)が可能になるイメージ。

※正しくは、CSRを作成時に作成された秘密鍵と証明書を紐づけることで開発が可能に。以下、分かりやすいようにCSR(秘密鍵)と記載します。

tip

シミュレーターなら証明書不要で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 ID
  • signingStyle: 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)でも静的に保持しておくと再現性のあるビルドが可能。

Resource