🍎

【Flutter/iOS】ややこしい証明書周りの関係をざっくり整理して理解してみた

2023/09/30に公開

何度も証明書周りの理解がこんがらがり、つまづいていたので、改めてざっくり噛み砕いて整理してみました。
ここでは全体の流れや、それぞれの項目の役割のイメージが掴めるように記載しています。

以下、基本的にはApple Developerの各種項目を基に順に見ていきます。


全体の大まかな関係性


1.CSR(Cert Signing Request:証明書署名要求)

「Appleからアプリ開発許可書(証明書)を発行してもらうための申込書」

ローカルPCのキーチェーンにて作成できる。
ローカルPC情報(個人特定情報)を申込書に記載するイメージ。

作成時に内部的に以下作成してくれる。

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

拡張子は.CertSigningRequest


2.Certificate(証明書)

「Appleからアプリ開発許可されたという証明書」

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

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

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


Certificate(証明書)には、主に以下2種類ある。

  • Development :開発用
  • Distribution :配信用

どちらもAppleからの開発許可証的な役割なので、仕組み基本は同じだが、どちらの証明書もチームに最大数が決まっていることに要注意。

運用としては、

  • 組織の開発者各々がDevelopmentの証明書を作成して、Distributionの証明書は組織で管理共有。
  • fastlaneとかを使用する場合は、Developmentの証明書も両方とも組織で管理共有。
    とかがよくあるパターンかと。

拡張子は.cer


3. .p12ファイル

「PC間で共有が可能なCertificate(証明書)≒Certificate(証明書)の完成版」

Distributionの証明書を組織で共有する例を挙げると、
Certificate(証明書)だけを共有しても、共有した先のPCにCSR(秘密鍵)が無いと情報が一致せず開発ができない。
そこで、Certificate(証明書)とCSR(秘密鍵)を一つのファイルにまとめたものが.p12ファイル。
この.p12ファイルを共有することで、どのPCでも開発が可能となる。

どのPCでも開発が可能となる。ということは、逆に言うと誰でも開発が可能となることになるので、取り扱い、保管には十分注意が必要

また、.p12ファイルを作成する際は、CSR(秘密鍵)とCertificate(証明書)とが紐づいている大元のPCが存在することになるので、大元のPCは組織内のどのPCなのかは把握しておいた方が吉。
新しいPCへ移行時や、退職者が出た時などに困る可能性があるため。

拡張子は.p12


4.Identifier(識別子)

「「このアプリは誰が作って、こんな機能を使ってますよ。」という名札」

Identifier ≒ App ID
他の記事ではApp IDと記載されていることが多い。

実際にApple DeveloperのIdentifiersで作成ボタンを押すと、すぐにApp IDの作成をすることになるので、実質は同じことかと。

Apple DeveloperのIdentifiersでは主に以下を指定して、App IDを作成する。

  • Bundle ID:アプリを識別する文字列
  • App ID Prefix:Team IDが自動で割り振られる
  • Capabilities or AppServices: 使用する機能を選択する(push通知とか)

Identifier(≒App ID)には開発用や配信用などの種類はなく、統一で1つでOK。


5. Device

「開発に使用する端末情報」

開発用に実機ビルドをする端末や、AdHoc配信でアプリインストールする端末は、端末情報の登録が必要。


6. Provisioning Profile

「アプリを実機で動かすためや、App Storeに公開するための許可証」

Apple Developerの項目ではProfileと記載されている。

上記で作成した項目を一つにまとめる、最終結合するイメージ。

  • Certificate(証明書)
  • Identifier(識別子)≒ App ID
  • Device(端末情報)


ややこしいポイントとしては、
Provisioning Profileの作成は、以下の用途それぞれで作成する必要があること。

  • Development(開発用)
  • AdHoc(配信用)
  • App Store(配信用)

そして、
Certificate(証明書)は、Development(開発用)とDistribution(配信用)の2種類であること。
ここの違いは注意。

拡張子は.mobileprovision


7. Keys(.p8ファイル)

「特定の機能を使用するための鍵」

このKeysは開発に必須では無いので、Provisioning Profileに組み込むとかは無い。

主には他のミドルウェアにKeyを渡して、iOSの機能を使用するイメージ。
よく使用されるのKeyの例として、APNs(push通知)とかだと、KeyをFirebaseに渡してFirebaseからAPNsを使用するイメージ。

拡張子は.p8



おわり

ざっくりと簡単な言葉に置き換えて記載しているので、認識が違っている箇所があればそっとコメント頂けると幸いです。


参考記事
GitHubで編集を提案
NCDCエンジニアブログ

Discussion