/ ios

APNs証明書を作る(アプリ登録済みの場合)

ザックリとメモする

Step.1

Apple Developer CenterでCertificatesの登録リクエストを行う。

  • Certificates > +ボタン > 「Apple Push Notification service SSL」
  • iOSアプリがDevelopment証明書を使用する場合はSandbox, Distributionビルドを使用する場合はProductionになる
  • Continue

Step.2

APNs証明書が使用するAppIDを選択

Step.3

Certificateの生成

証明書アシスタントでリクエストを作成する

  • キーチェーンアクセスを起動(/Applications/Utilities/キーチェーンアクセス)
  • 画面左上のメニューから「キーチェーンアクセス」>「証明書アシスタント」>「認証局に証明書を要求」

証明書アシスタントの入力内容

  • メールアドレス > ユーザのメールアドレス
  • 通称 > 識別情報がわかる名前
  • CAのメールアドレス > 空欄
  • ディスクに保存

CertificateSigningRequest.certSigningRequestが作成される

証明書のジェネレート

ブラウザに戻り、作成したcertSigningRequestをアップロード。
generateが完了したらcerファイルの作成が完了するのでダウンロードしておく。

cerファイル名の初期値はsandboxの場合はaps_development.cer
productionの場合はaps_production.cerになる

ダウンロードしたcerファイルをキーチェーンに追加する。
ファインダーでダブルクリックで追加可能。

作成の前に

ダウンロードしたままのディレクトリだと見通しが悪いのでディレクトリを作成してファインダーで表示

$ mkdir ~/Desktop/apns
$ cd ~/Desktop/apns
$ mv ~/Downloads/aps_development.cer .
$ open .

ファインダー上でcerファイルをダブルクリックしてキーチェーンアクセスに追加する。

p12ファイルの作成

キーチェーンアクセスで追加したpemファイルからp12ファイルを出力する。
キーチェーンアクセスの検索窓で「iOS Push Service」と入力すればフィルタがかかる。

証明書のp12ファイルを書き出す。
該当の証明書が正常に追加できている場合、証明書名の左に▲が表示されているのでクリックして展開。
「種類」が「証明書」になっているものを展開すると「秘密鍵」が表示される

展開した状態のまま、証明書を右クリックしてp12ファイルとして書き出す。
ファイル名はaps_development_cert.p12とした。

秘密鍵の方もp12ファイルとして書き出す。
ファイル名はaps_development_key.p12とした。

p12ファイルの書き出し方

  • フォーマットで「個人情報交換(.p12)」を選択(デフォルト)
  • 適当な場所を選択して「保存」を押す
  • 「書き出した項目を保護するためのパスワード」がいわゆるパスフレーズに設定される
  • 最後にキーチェーンアクセスに一時的にroot権限を与えるためのログインパスワードを入力すると書き出しが完了(聞かれないときもある)

書き出す

パスフレーズがたくさん求められる

$ openssl pkcs12 -clcerts -nokeys -out aps_development_cert.pem -in aps_development_cert.p12
$ openssl pkcs12 -nocerts -out aps_development_key.pem -in aps_development_key.p12
$ openssl rsa -in aps_development_key.pem -out aps_development_key_noenc.pem
$ cat aps_development_cert.pem aps_development_key_noenc.pem > aps_development.pem

テスト

node-apsの場合はこうなる

var options = {
  gateway: 'gateway.sandbox.push.apple.com',
	cert:'development_cert.pem',
	key:'development_key.pem',
  passphrase: '書き出しで使用したパスフレーズ'
};
var apnConnection = new apn.Connection(options);