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の資料によると証明書の発行プロセスは大別して
- 加入者(証明書が発行される側。APNs - プロバイダ間でいうとプロバイダ、アプリ開発者のほう)が鍵ペアを生成する方式
- 登録局が一括して鍵ペアを生成する方式
の2通りあります。
この記事などの手順にあるように、APNsから証明書発行してもらうプロセスはプロバイダ側がキーペアを含めたCSRを作成するところから始まるので1の方ですね。
まず、1. の手順に「加入者が鍵ペアを生成する」について。APNsの証明書を作成する場合は、「キーチェーンアクセス > 認証局に証明書を要求...」から .certSigningRequest
ファイルを作成します。
作成した .certSigningRequest
ファイルをApple開発者アカウントの管理画面からAPNsのシステムへアップロードすることが、KPIでいう加入者の認証局に対する証明書の発行申請にあたり、アップロード後にダウンロードした .cer
ファイルが Apple側の署名がなされた証明書となっています。
ところで、「加入者が鍵ペアを生成する」の文言と 「「キーチェーンアクセス > 認証局に証明書を要求...」から .certSigningRequest ファイルを作成」 の内容があってないですね。
実は「キーチェーンアクセス > 認証局に証明書を要求...」をクリックしたときの画面をみてみると
のようになっており、 .certSigningRequest
ファイルを作成する前に秘密鍵と公開鍵のキーペアを生成しているようです。
この秘密鍵はキーペアを生成したMac(システム)に配置され、キーチェーンからのみアクセスできるようで、他のMacに移行したりプッシュ系のmBaasを利用する場合などはAppleから発行された証明書( .cer
ファイル)に秘密鍵を含めて .p12
ファイルに書き出す必要があります*8。
参考
- https://developer.apple.com/jp/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html
- https://www.ipa.go.jp/security/pki/034.html#_Toc3020776
- https://qiita.com/kunichiko/items/12cbccaadcbf41c72735
- http://www.geocities.co.jp/SiliconValley-SanJose/3377/
- https://www.sambaiz.net/article/135/
- https://dev.classmethod.jp/smartphone/iphone/apple-certificates-summary-and-etc/
*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/
*7:データさえ渡せればいいので、ファイルとして送る必要は特にないが、Appleの開発者管理画面の画面がファイルとしてアップロードする形だったのでファイル表記
*8:https://dev.classmethod.jp/smartphone/iphone/apple-certificates-summary-and-etc/