ちょっと厨二っぽいSEのブログ

プログラミングとかのシステム備忘録など

Push通知の証明書、p12 -> pem変換について

Push通知の証明書をP12からPEMに変換する方法、Push通知のテストをする方法、Push通知の証明書の種類などをまとめました。
範囲としては、キーチェーンからp12を作るところから、pemに変換するところまでになります。

証明書(PEM、P12)の種類

push通知の証明書はその役割によって4パターンのファイルにわけることができます。
push通知はサーバーに置いて使いますが、送信実行するにあたりパスワードや秘密鍵を設定することができます。
ここではわかりやすいように、以下のファイル名を使用します。
拡張子はp12とありますが、システムによりpemに変換する必要があります。

xxx_push_production.p12 : パスありの証明書
xxx_push_production_secret.p12 : 証明書の秘密鍵
xxx_push_production_secret_noenc.p12 : 証明書の公開鍵(秘密鍵のパスワードを解除したもの)
xxx_push_production_test.p12 or xxx_push_production_all.p12 : パス無しの証明書(=証明書と公開鍵をあわせたもの)

p12 書き出し方法

一番簡単なものはパスワード無しの証明書を作成する方法です。
push通知を送る際パスワードを使用しませんので、テストに使用するのには良いと思います。
キーチェーンからp12を書き出す際は、以下のように証明書を選択(鍵ごと選択します)
xxx_push_production_test.p12 という名前で保存します。
f:id:ryokwkm:20170627194939p:plain


サービスを運用するにあたり、証明書とキーは分けて管理するのが一般的です。
やり方はそれぞれ以下のとおりで、
書き出し後にパスワードを求められますので、設定してください。

証明書の書き出し

xxx_push_production.p12 として保存
f:id:ryokwkm:20170627200317p:plain

秘密鍵の書き出し

xxx_push_production_secret.p12 として保存
f:id:ryokwkm:20170627200344p:plain




P12ファイルからPEMファイルへの変換方法

pemの種類によってコマンドが異なります。
コマンド実行時にパスワードを求められますが、これは出力時に設定したパスワードを入力してください。

・証明書(パス無し)

openssl pkcs12 -clcerts -nodes -out xxx_push_production_test.pem -in xxx_push_production_test.p12

・証明書(パス付き)

openssl pkcs12 -clcerts -nokeys -out xxx_push_production.pem -in xxx_push_production.p12

秘密鍵

openssl pkcs12 -nocerts -out xxx_push_production_secret.pem -in xxx_push_production_secret.p12

秘密鍵パスフレーズを解除し、公開鍵へ変換

openssl rsa -in xxx_push_production_secret.pem -out xxx_push_production_secret_noenc.pem

パスレーズを解除する目的や使い方

鍵ありの状態ですと、apache等のサーバーでは起動のたびにPEMフレーズ (PEM phrase) の入力を求められます。そのため、暗号化された秘密鍵は復号化して使うのが一般的です。
復号化した秘密鍵はroot以外は読めない状態で保存すべきです。

証明書と公開鍵をあわせる

cat xxx_push_production.pem xxx_push_production_secret_noenc.pem > xxx_push_production_all.pem



証明書のパスワードを確認する方法

古い証明書や自分以外が作成した証明書など、パスワードを確認したい場合があると思います。
方法はいくつかあると思いますが、以下のコマンドを実行するとパスワードが求められますので、
それが想定したものとあっているか確認する方法が最も簡単な方法です。
openssl rsa -in xxxx_push_production.pem




疎通テスト方法

証明書が正しいか、ターミナルからお手軽にテストすることができます。
注意すべきなのは、Xcodeから実機インストールした場合、テストできるのはdevelopのpush通知のみだということです。

・疎通テスト(パス無し)

openssl s_client -connect gateway.push.apple.com:2195 -cert xxx_push_production_all.pem

・疎通テスト(パスあり)

openssl s_client -connect gateway.push.apple.com:2195 -cert xxx_push_production.pem -key xxx_push_production_secret.pem

Push通知を送ってみる

アプリと証明書、両方のテストがしたい場合、実際にPush通知を送ってテストします。
PHPとは違い、Rubyでしたら数行書くだけで簡単に送れますので、そのサンプルを載せておきます。

gist.github.com