iOSアプリを実機で動かす

前置き

iOSアプリを実機で動かす。そのための手順は、色々なサイトでスクリーンショットなどと共に説明されています。本記事では、その過程で登場する、鍵ペア、CSR、証明書、プロビジョニングプロファイルなどの役割や仕組みをまとめてみようと思います。仕組みを理解しておけば、Appleの都合で手順が少々変わったとしても対処できるでしょう。

なお、私個人はiOS開発者登録しておらず、職場で体験した記憶を頼りに書いているので、間違いもあるかもしれませんが、ご容赦下さい。

暗号の基礎知識

公開鍵とか証明書といった用語の理解が欠かせないので、まずはその辺から。

※以下ではRSAについて言及していますが、その多くは公開鍵暗号全般に言えることです(RSAは公開鍵暗号の方式の1つ)。

RSA

インターネットのように、誰からにも見られる可能性のある環境で、安全に情報を交換するには、以下の2つの要求を満たす必要があります。

  • 機密性(Confidentiality) ...部外者に情報が読めないようにしたい
  • 完全性(Integrity)...情報自体は秘密ではないが、部外者により改ざんされてないことを検証したい

これに応えるのがRSAと呼ばれる暗号技術です。RSAでは2つの鍵(鍵ペア)を使います。

  • 公開鍵(Public Key)...一般に公開する
  • 秘密鍵(Private Key)...自分だけの秘密にしておく

まず機密性について。誰かに秘密裏に情報を伝えたい場合は、その人の公開鍵で暗号化して送ります。RSA方式による暗号文は、秘密鍵を持っている人だけが復号できます。公開鍵で暗号化して、秘密鍵で復号できる(つまり秘密鍵を共有する必要がない)、というのがRSAのスゴイところです。

enc

一方、完全性についてはどうでしょうか。伝えたい情報に対して、あなたの秘密鍵を使って(RSA方式の)ある特殊な演算を行うと、あるコードが生成されます。このコードを元の情報に添付して送ると、相手は、情報が改ざんされてないことを検証できるのです(RSAのおかげで)。どうやって検証するかはともかく、検証する人に必要なのは、元の情報と、コードと、あなたの公開鍵だけです(秘密鍵は不要)。

上記の説明に出てきた「コード」のことを電子署名、あるいは単に署名(Signature)と呼びます。現実世界で、手紙の最後にサインするのと同じ図式です。あなたのサインを他人が真似できないのと同じように、RSAが生成する署名を、あなたの秘密鍵を知らない他人がねつ造することはできません。

sign

PKI

RSAを活用するには、まず公開鍵を公開しておく必要があります。単純にメールやWebで配布すれば良さそうですが、その内容が改ざんされては元も子もありません。そこで、PKI(Public Key Infrastructure: 公開鍵基盤)と呼ばれる、公開鍵を安全に配布するための仕組みが提供されています。

PKIのもとでは、あなたの公開鍵の完全性を保証するために、ある信頼された機関が、あなたの公開鍵に署名します。つまり、伝えたい情報(=あなたの公開鍵)に対し、信頼された機関の秘密鍵でコード(=署名)を生成するわけです。この「信頼された機関」のことをCA(Certificate Authority: 認証局)と呼びます。また、あなたの公開鍵とCAの署名をセットにしたものを電子証明書、あるいは単に証明書(Certificate)と呼びます。証明書を受け取った第三者は、CAの公開鍵を使ってあなたの公開鍵の完全性を検証できます。

cert

ここで、CAの公開鍵の完全性をどうやって保証するか? という疑問が生じますが、その答えは「もっと信頼できるCAの署名を付ける」です。再帰構造になってますね。よって証明書はチェーンしていきます。そしてチェーンの最後には「最も信頼できるCA」が自分自身で自分の公開鍵に署名した「ルート証明書」が来ます。ルート証明書は、何らかの非常にセキュアな方法(手渡しとか?)で配布され、OSやWebブラウザに組み込まれます。ルート証明書を発行するCAのことを、ルートCAとかトラステッドアンカー(Trusted Anchor)と呼びます。

chain

CSR

CAに依頼して、自分の公開鍵に署名してもらうには、CSR(Certificate Signing Request: 証明書署名要求)を作る必要があります。CSRには、自分の公開鍵と、それに対する自分の署名が含まれます。これをCAに送るわけですが、当然ここにも改ざんの危険があるので、httpsなどの安全な通信路を使う必要があります。

CAはボランティアじゃないので、証明書の発行には費用がかかります。

本題

登場人物

MemberCenter
iOS開発者向けのAppleのサイト。要登録。また登録には年会費とApple IDが必要。
Mac
開発用マシン。鍵と証明書の管理にはMacOS標準アプリの「キーチェーンアクセス」を使う。
実機
iOS端末(iPhoneとか)。

overview

プロビジョニングプロファイル

突き詰めると、iOSアプリを実機で動かすのに必要なものは、プロビジョニングプロファイル(Provisioning profile)です。Provisioningの適当な訳が思い浮かびませんが、たぶん、あとから機能やサービスを追加・更新できるような仕組みを、あらかじめ製品に仕込んでおくことを指す言葉だと思います(ケータイのソフトウェア更新とかWindows Updateのイメージ)。長いので「プロビ」と表記しましょう。プロビには、以下の情報が格納されています。

  • どのアプリを動かすか
  • そのアプリは、どんなサービス(iCloudとかPush Notificationとか)を使うか
  • どの実機で動かすか
  • アプリの署名を検証するための公開鍵(が格納された証明書)

ここからも分かりますが、プロビの役割は、実機に妙なアプリがインストールされるのを防ぐことです。

プロビは、MemberCenterで作成し、ダウンロードしてXcodeに組み込んでおきます。Xcodeでアプリをインストールするとき、署名されたアプリと共に実機へロードされます。おそらくプロビの完全性は、実機に内蔵されたルート証明書(の中の公開鍵)を使って検証されるのでしょう。

MemberCenterでプロビを作成するには、以下に説明する、いくつかの準備が必要です。

アプリの登録

まず、アプリをMemberCenterへ登録します。このとき、アプリが利用するサービス(iCloud, Game Center, Push Notificationなど)も設定しておきます。

ここで決まるApp ID(Bundle ID)をプロビに登録します。

実機の登録

実機のUUIDをMemberCenterへ登録します。プロビを作成するときに、対象とする実機を選択(複数可)します。

UUIDはiTunesで調べることができます。

鍵ペアと証明書を作成

実機で動かすアプリには、あなたの秘密鍵で署名します。また、署名を検証するための公開鍵(を格納した証明書)をプロビに格納しておきます。この鍵ペアが、開発者を識別するIDの役割を果たしていると言えるでしょう。大事にして下さい。実機は(つまりiOSは)、プロビ内の公開鍵を使って、インストールしようとしているアプリの完全性を検証します。

プロビに格納する証明書のルートCAはAppleです。よって、MemberCenterへCSRを送れば証明書を発行してもらえます。

CSRを作るには、Macのキーチェーンアクセスを使えば良いでしょう(メニューにある「証明書アシスタント」から)。このとき署名対象の鍵ペアを指定しなければ、新しい鍵ペアが作成され、自動的にキーチェーンアクセスに登録されます。既に鍵ペアを持っている場合は、それをキーチェーンアクセスに登録しておき、それを選択してCSRを作成しましょう。

csr

証明書が発行されたら、MemberCenterからダウンロードして、キーチェーンアクセスに登録しておきます。キーチェーンアクセス上で証明書を見ると、まるでその中に秘密鍵も入っているかのように見えますが、実際はそうではありません。キーチェーンアクセスが、証明書と、それに対応する秘密鍵をセットにして表示しているだけです。

keychain

Push Notification用の証明書

詳しい説明は割愛しますが、アプリにPush Notificationを送るときは、APNsとプロバイダとの間でSSL通信を行います。ネット通販のようにサーバ側の認証だけを行うhttpsとは異なり、このSSL通信ではAPNsとプロバイダが相互認証を行うので、プロバイダ側にも鍵ペアと証明書が必要です。

この証明書は、アプリの署名検証のための証明書とは別に、MemberCenterへ発行依頼します(鍵ペアは同じでも良いかも)。プロバイダが使うものなので、キーチェーンアクセスに登録する必要はありません。またプロビに格納するようなものでもありません。

プロバイダには、APNsの署名を検証するためのルート証明書も必要です。設定方法はプロバイダ側で使うフレームワークに依存します(JavaならJREが持ってるので設定不要、とか)。

Last modified:2015/02/20 11:22:37
Keyword(s):
References:[Macリテラシ]
This page is frozen.