💡
俺の考えた一番わかりやすいAppleの証明書周りの解説(N番煎じ)
そもそもなぜこんなこと(証明書やら署名やら)をやる必要があるのか
- iPhone(iOS)は信頼できるアプリしか実行しない仕組みになっているから
- よって開発者はiPhone(iOS)に自分のアプリが信頼できるものとして認めさせる必要がある
- ここでいう信頼できるとは下記が満たされている状態を指す
- 開発者がどこの誰だかわかる(Appleにとって)
- 開発者本人が実装したことが保証できている(開発者本人のみが秘密鍵を知っているはず)
- 改竄されていないことが保証されている(電子署名によって)
登場人物
- すでに素晴らしい記事があるのでそちらを参照しましょう
以下に見出しのみ引用
証明書署名要求(CSR):
.certSigningRequest
ファイル
証明書(Certificate):.cer
ファイル
Signing Identity:.p12
ファイル
Provisioning Profile:.mobileprovision
ファイル
全体の流れ
- すでに素晴らしい記事があるのでそちらを参照しましょう(2回目)
下記に引用します
登場人物それぞれ役割を踏まえて、アプリをAd-hoc配布する際にコード署名でやらなければいけないこと、起こることの流れを簡単にまとめます。
- キーチェーンアプリでCSRを作成。このときに裏で鍵ペアが生成される
- CSRをDeveloper CenterにアップロードしてDistribution用の証明書を取得する
- キーチェーンアプリで証明書からp12ファイルをエクスポートしておく
- Developer Center上でProvisioning Profileを取得する
- App IDを登録
- アプリをインストールしたいデバイスのIDを登録
- 以上の情報からProvisioning Profileを作成し、ダウンロード
- XCodeにProvisioning Profileをimportする
- アプリをアーカイブする。ここで、XCodeがProvisioning Profileに含まれる証明書と結びつく秘密鍵を取得し、署名もしてくれていると思われる
- なんらかの手段でアプリを配布する。ダウンロードしたiOS端末ではProvisioning Profileを使ってアプリが検証され、OKならばインストール/実行される
- すでに素晴らしい記事2にわかりやすい図があるのでそちらも参照しましょう(3回目)
式として表してみる
証明書署名要求(CSR) = 公開鍵 + 開発者の情報 ・・・(1)
証明書(Certificate) = CSR + Appleの署名・・・(2)
Siging Identity(p12) = 公開鍵 + 秘密鍵(開発者本人しか持っていないはず)・・・(3)
Provisioning Profile = AppID + Certificate + DeviceID List・・・(4)
# (4)は展開できる
Provisioning Profile = AppID + Certificate + DeviceID List
= AppID + CSR + Appleの署名 + DeviceID List # (2)より
= AppID + 公開鍵 + 開発者の情報 + Appleの署名 + DeviceID List # (1)より
最後の式と,下記2点を考え合わせると
- アプリに同梱するのはProvisioningProfileであること
- アプリ全体はアーカイブ処理の中で,Signing Identity(の秘密鍵)で署名されていること
iPhone(iOS)はダウンロードしたProvisioning Profileから以下のことが確認できる
- Appleの署名によって
公開鍵
と開発者の情報
のペアが正しいこと - 公開鍵を利用して
- アプリに付属する署名が一致することからアプリが改竄されていないこと
- 秘密鍵を利用した署名であることから開発者本人が作成したアプリであること
- (開発版の場合)DeviceID Listから開発版の配布対象の端末であること
上記がそれぞれ確認できたことで,iPhoneはアプリを信頼できるものだとみなすことができた
素晴らしい先人たちの記事
- https://qiita.com/maiyama18/items/88567365dde2a3b3cc92
- https://dev.classmethod.jp/articles/apple-certificates-summary-and-etc/
- https://zenn.dev/mhackit/scraps/355fe56dc7b4c8
書いたモチベ
式として表すだけで自分にとってはよりわかりやすくなったので,記事化する意味があると思ったので.
わかった気になったらLIKEお願いします
Discussion