くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

iOSの証明書について

今回はiOSで使用する証明書についてです

アプリをビルドしたり、リリースしたりする際に証明書関連の対応手順は理解していても、それぞれどんなことをしているのかがあまり理解できていなかったので、調べてまとめます

まずは全体像を下記に載せます

ビルドやアーカイブを行うために必要な手順を図にしました。それぞれの手順をもう少し詳しく説明します

証明(署名)とは?

ビルドやアーカイブを行うために必要な手順を説明する前に、そもそも証明とは一体なんでしょうか?

証明(署名)は、iOSが信頼できるアプリしかインストールしないようにするための仕組みです

信頼できるアプリとは開発者を特定できるというのと開発者が署名してからアプリが改変されていないという2つの条件を満たすものを指しています

信頼できないアプリは適当な人が作った適当なアプリや、ちゃんとした開発者が作り、その後別の誰かによって改変されたアプリをインストールすることが可能ということになります

これを防ぐため、iOSでは署名されたアプリしか実行できないようになっており、開発者はアプリに署名をする必要になります

証明(署名)の大まかな流れ

アプリの開発者は、公開鍵/秘密鍵のペアを用意します

公開鍵はデジタル証明書の形でインストール先のiOSに渡され、秘密鍵は鍵ペアを生成したマシンに保持され、署名に使われます

アプリをアーカイブする際、あらかじめ決められた手順でアプリからハッシュ値を計算し、これを秘密鍵で暗号化してアプリに同梱します。このプロセスを署名と呼びます

アプリをインストールしたiOSは、同じ手順でアプリからハッシュ値を計算します

一方で、アーカイブ時に計算されて暗号化されたハッシュ値を証明書に含まれている開発者の公開鍵で復号する。

これら2つの方法で得られたハッシュ値が一致することを確認します

ここで、まず暗号化されたハッシュ値が正しく復号できたことで、開発者の特定ができます

ハッシュ値が公開鍵で復号できるということはそれを暗号化したのは開発者の秘密鍵であり、秘密鍵を持っているのは開発者本人しかいないからです

次に、2つのハッシュ値が一致したということから、開発者が署名した後アプリが改変されていないことの確認ができます

もし第三者がアプリの内容をいじっていたらiOSで計算されるハッシュ値が変わってしまい一致しません

ハッシュ値の方も一緒に変えられた場合には、第三者は開発者の秘密鍵を持っておらずハッシュ値の暗号化ができないため、改変したハッシュ値を差し替えることができないです

適当な秘密鍵で暗号化することは可能ですが、そうすると開発者の公開鍵では復号できず、そこでiOSでの検証に引っかかります

CSRファイル作成

まずは図の①のCSR(証明書署名要求)についてです

CSRは証明書署名リクエストです。公開鍵に開発者情報などを付加したもので、これををAppleに渡すことで、Appleから証明書をもらうことができます

ローカルのキーチェーンで作成し、証明書を作成するのに使います

前の項に書いたように、コード署名というのは大雑把に言うとこのとき生成された秘密鍵で開発者がアプリに署名をし、それをインストール先のiOSが公開鍵で検証するというものなので、ここで生成される鍵ペアは非常に重要な役割を持ちます。

作成時に、秘密鍵と公開鍵も同時に作られます

作成方法はキーチェーンアクセスから「証明書アシスタント」>「認証局に証明書を要求」を選択します。すると、鍵ペア情報が表示されるので、鍵のサイズは2048ビット、アルゴリズムRSAを選択して作成します

作成したファイルはApp Developer Programで登録(アップロード)します

.cerファイル作成

ここでは図の②、③について説明します

まずは、作成したCSRファイルをApp Developer Programで登録します

登録する際には開発用か本番用かを選択したり、プッシュ通知を導入するかなどの選択を行います

ここではユーザーの公開鍵含まれていて、認証局秘密鍵で暗号化します

設定が完了してCSRファイルをアップロードしたら、拡張子が.cerのファイルをダウンロードできると思います

一般的に.cerファイルと呼ばれているこのファイルは開発者個人を特定するための証明書、またはAd Hoc用やリリース用の証明書です

.cerファイルをダウンロードして取り込む(ファイルをダブルクリック)ことで、ローカルマシン内のキーチェーンアクセス上で証明書と秘密鍵が紐付きます(登録されます)

.cerファイルを取り込んだけれども、キーチェーンアクセス上で証明書しか表示されないという場合、CSRファイルを作ったローカルマシンと.cerファイルを取り込んだマシンが一致してない可能性があります

p12ファイル

例えば、PCが壊れたので別のPCを使うとなった場合に、CSRファイル作成からやり直さなければいけないでしょうか?

やり直さなくていいように.p12ファイルを取得するという方法があります

.p12ファイルとは証明書の他に秘密鍵を含めたファイルです。ビルドを行うPCを変更する場合にも.cerファイルを取り込むのと同じようにできます

キーチェーンアクセス上で取り込んだ証明書を右クリックで「○○○○○を書き出す」を選択します

そして、フォーマットで.p12を指定して保存ボタンを押すと.p12ファイルが保存されます

別のPCに変更する場合には.p12ファイルをダブルクリックで取り込めば証明書を取り込んだことになります

Provision Profile登録

次にProvision Profileを取り込む必要があります

Provision ProfileとはアプリのIDや証明書、開発用のデバイス情報を内包したファイルです

これにより、開発用にビルドしたアプリが指定した端末以外で立ち上げられないようになります

また、これに保存されている証明書と、前々節で説明したキーチェーンに登録した証明書が一致した時のみビルドが許される仕組みとなっています

Provision Profileを取り込むためにはApp Developer Programで設定が必要になります

App Developer Programでの追加設定

Provision Profileを作成するためにAppIDの登録と実行デバイス情報の登録を行います

まずはAppIDの登録ですが、アプリのBundleIDを登録します

配布アプリが端末内で動作する条件の中にアプリのBundleIDが、AppIDと一致するというものがあります

よって、開発環境や本番環境など複数の環境のProvision Profileを作成する場合には複数のBundleIDが必要になります(Provision Profileは環境ごと必要)

そして、使用する端末のUDIDを登録する必要があります。登録した端末のみでビルドできるように制限するためです

App Developer ProgramでAppIDや使用する端末情報を登録するとProvision Profileがダウンロードできると思います

ダウンロードしたProvision Profileをダブルクリックして取り込んだら、Xcodeの対象のプロジェクトでBundle IDやSigning(署名)の設定を行うとビルドやアーカイブができるようになるはずです

参照

mmorley.hatenablog.com

blue-red.ddo.jp

scrapbox.io