woshidan's blog

そんなことよりコードにダイブ。

APNsのプッシュ通知で利用するプロバイダ証明書関連の各種ファイル形式について調べてみたメモ

前の記事では、APNsとプロバイダの間の接続信頼の話をしました。この記事では、接続信頼の確認に使う証明書関係のファイルの話をします。

複数の鍵や証明書をまとめて扱うための個人情報交換( .p12 )

まず、Push通知の証明書関連で調べているとよく出てくる .p12 という拡張子のファイルですが、これは日本語では 個人情報交換 と呼ばれています。

個人情報交換は、その内部に複数の鍵や証明書をまとめて格納することが可能で、パスワードでそれらのファイルを保護します。

たとえば、よくある1つのiOSアプリ用に使うプッシュ通知用の証明書だと、キーチェーンから書き出した .p12 ファイルの中にPEM形式の鍵と証明書が含まれています。なので、こちらの記事のように、 .p12 のファイルから .pem のファイルを書き出したりします。

証明書のデータ構造のエンコーディング( PEM, DER )と公開鍵基盤用の規格 X.509

PEM 形式の鍵、証明書は鍵、証明書のデータの部分がBase64エンコーディングされています*1

これに対し、鍵、証明書のデータの部分がバイナリエンコーディングされているのが DER 形式の鍵・証明書で、 PEM, DER 形式のファイルに含まれる証明書・鍵のデータは ASN.1(アセンワン) という言語で定義されています*2

もう少しかっちり書くと、 X.509 という公開鍵証明書と証明書失効リストを含む公開鍵基盤(PKI)について定義される規格があり、その中で PKI 用証明書のエンコーディングには ASN.1 DER エンコーディングが使用されるように定義されています*3。また、 X.509 に基づいて作成・運用される証明書が X.509 証明書 と呼ばれているみたいです*4

APNS - プロバイダ間の接続信頼を確認する際は、この X.509 証明書のデータを利用します。その際、エンコーディングされた文字列ではなく ASN.1 で定義された型のオブジェクトまでデコードする必要があります。

証明書署名要求( CSR )を使ってAppleからの署名によりApple公認のプロバイダであることを証明する

順番はやや異なりますが、ここまで

  • X.509 という公開鍵基盤( PKI )について定義する規格がある
  • X.509 の公開鍵証明書は ASN.1 という言語で*5型が定義されている
  • 個人情報交換 ( .p12 のファイル) で、証明書のデータをエンコーディングした PEM と鍵のデータをエンコーディングした PEM などを合わせて格納する

という話をしました。では、鍵と証明書*6.pem ファイルが中に入った .p12 ファイルでありさえすれば、どんなものでも APNsとの間の接続信頼の確認に使えるのでしょうか。

もちろん、そうではありません。

APNsとの間の接続信頼を確認するためには、Appleと契約を結んだ組織に属していることを証明する必要があります。そして、そのために接続信頼の確認に利用する証明書にはAppleの署名が必要です。

公開鍵証明書に特定の組織(公開鍵基盤の言葉でいうと、認証局)の秘密鍵電子署名をしてもらう。そのために認証局へ提出するファイル*7証明書署名要求(CSR: certificate signing request) といいます。

CSRを用いたApple側の署名入り証明書作成手順について備考

最後に、公開鍵基盤(PKI)の証明書署名要求(CSR)を用いた証明書の作成手順をAPNsの具体事例にあわせておさらいしておきましょう。

まず、IPAの資料によると証明書の発行プロセスは大別して

  1. 加入者(証明書が発行される側。APNs - プロバイダ間でいうとプロバイダ、アプリ開発者のほう)が鍵ペアを生成する方式
  2. 登録局が一括して鍵ペアを生成する方式

の2通りあります。

この記事などの手順にあるように、APNsから証明書発行してもらうプロセスはプロバイダ側がキーペアを含めたCSRを作成するところから始まるので1の方ですね。

まず、1. の手順に「加入者が鍵ペアを生成する」について。APNsの証明書を作成する場合は、「キーチェーンアクセス > 認証局に証明書を要求...」から .certSigningRequest ファイルを作成します。

作成した .certSigningRequest ファイルをApple開発者アカウントの管理画面からAPNsのシステムへアップロードすることが、KPIでいう加入者の認証局に対する証明書の発行申請にあたり、アップロード後にダウンロードした .cer ファイルが Apple側の署名がなされた証明書となっています。

ところで、「加入者が鍵ペアを生成する」の文言と 「「キーチェーンアクセス > 認証局に証明書を要求...」から .certSigningRequest ファイルを作成」 の内容があってないですね。

実は「キーチェーンアクセス > 認証局に証明書を要求...」をクリックしたときの画面をみてみると

f:id:woshidan:20180620203346p:plain

のようになっており、 .certSigningRequest ファイルを作成する前に秘密鍵と公開鍵のキーペアを生成しているようです。

この秘密鍵はキーペアを生成したMac(システム)に配置され、キーチェーンからのみアクセスできるようで、他のMacに移行したりプッシュ系のmBaasを利用する場合などはAppleから発行された証明書( .cer ファイル)に秘密鍵を含めて .p12 ファイルに書き出す必要があります*8

参考

*1:余談ですが、Base64エンコードすると最後に=ってつくことありますが、それはデータがエンコード文字列の長さで表せる量に対して中途半端に短かった時の穴埋めなんだそうな https://ja.wikipedia.org/wiki/Base64

*2:DERの仲間にBER, CERがあり、DERはBERのサブセット http://www.geocities.co.jp/SiliconValley-SanJose/3377/

*3:https://www.ipa.go.jp/security/rfc/RFC2459JA.html

*4:みたいですってなんやねんって話ですが、PEMとかファイル形式で説明されていることが多くてちょっとだけ自信がない

*5:X.509証明書以外にもASN.1で定義されているものはあります http://www.geocities.co.jp/SiliconValley-SanJose/3377/

*6:APNsの場合、RSAのキーペアを利用する

*7:データさえ渡せればいいので、ファイルとして送る必要は特にないが、Appleの開発者管理画面の画面がファイルとしてアップロードする形だったのでファイル表記

*8:https://dev.classmethod.jp/smartphone/iphone/apple-certificates-summary-and-etc/