シェルからpkpassを作ってみた。
主にopensslコマンドを利用した。
バージョンはOpenSSL 0.9.8e-fips-rhel5 01 Jul 2008。
※ 筆者はMac弱者。
1.PassTypeIdを取得
MacのキーチェーンアクセスとiOS Provisioning Portalを駆使して作成する。
- Finderを開く
- アプリケーション→ユーティリティ→キーチェーンアクセスを開く
- キーチェーンアクセス→証明書アシスタント→認証局に証明書を要求
- メールアドレスを入力し、「ディスクに保存」を選択し続行
- キーチェーンアクセスのパスワードを入力する
→ 証明書要求ファイル(CSR)が作成される - ブラウザでiOs Provisioning Portalを開く(予めデベロッパーアカウントを登録しておく必要あり(有料))
- 左のメニューからPassTypeIdsを選択
- New Pass Type Idをクリック
- DescriptionとIdentifier(PassTypeId)を入力し、Submitする
→ 証明書と紐付いていないPassTypeIdが作成される - PassTypeIdsの画面に戻ると、1.9で登録した内容が一覧表示されているので、
Action/Configureをクリックする - Generate a Certificate Signing Requestのダイアログが表示される。ここには、上記で示した、証明書要求ファイル作成の手順が書いてある。もう作ってあるので、Continueをクリック。
- ファイルをアップロードしろと言ってくるので、作成した証明書要求ファイルをアップロードする
- 証明書の作成が完了し、PassTypeIdのPassCertificatesが有効になる。
2.証明書をp12に変換する
- PassTypeIdsの画面からPassTypeIdを選び、Action/Configureをクリック
- Action/Downloadをクリック
→ PassTypeIdに紐付いた証明書がダウンロードされる - キーチェーンアクセスを開き、ファイル→読み込むを選択
- 2.2でダウンロードした証明書を読み込む
→ キーチェーンアクセスに証明書が読み込まれる - 2.4で読み込んだ証明書を選択し、ファイル→書き出しを選択
- フォーマットを.p12として保存する
※ 2.5の前に、キーチェーンアクセスの左側にある「分類」で「自分の証明書」を選んでおかないと、「.p12」が選択できなかった。 - パスワードを指定する。指定したパスワードはどっかに控えておく。
→ p12ファイルが作成される
3.中間証明書を取得する
- iOs Provisioning Portalで、左のメニューからCertificateを選択する。
- Developmentタブを開き、「click here to download now.」リンクからダウンロードする。
→ 中間証明書.pemを取得
※ リンクが表示されていなければ「Add」をクリックし、1.5で作成したCSRをアップロードし、Certificateを有効にする
4.p12から証明書と秘密鍵を取り出す
- p12ファイルをopensslコマンドを利用可能な環境に配置する
- 以下のコマンドで証明書を取り出す
openssl pkcs12 -in {p12ファイル名} -clcerts -nokeys -out {任意の証明書ファイル名.pem}
→ 証明書ファイルが作成される - 以下のコマンドで秘密鍵を取り出す
openssl pkcs12 -in {p12ファイル名} -nocerts -out {任意の秘密鍵ファイル名.pem}
→秘密鍵ファイルが作成される
5.中身を用意する
今回はpass.json, logo.png, icon.pngだけを適当に用意した。
詳しくは、Passbookプログラミングガイドを参照。
6.manifest.jsonを作る
5の内容が改竄されてないよねっていう確認をするために、
各ファイルのハッシュをjsonにまとめてあげる必要がある。
次のようなシェルでどうだろうか(適当)。
#!/bin/sh→ manifest.jsonができる
target_dir=~/work
file_count=`ls ${target_dir} -F|grep -v /|wc -l`
i=0
echo "{" > manifest.json
for target_file in `ls ${target_dir} -F|grep -v /`
do
i=$((i+1))
if [ ${i} -ne ${file_count} ]; then
echo "\"${target_file}\":\"`openssl sha1 ${target_dir}/${target_file}| sed -e 's/^.*(\(.*\))= \(.*\)$/\2/'`\"," >> manifest.json
else
echo "\"${target_file}\":\"`openssl sha1 ${target_dir}/${target_file}| sed -e 's/^.*(\(.*\))= \(.*\)$/\2/'`\"" >> manifest.json
fi
done
echo "}" >> manifest.json
mv manifest.json ${target_dir}
7.manifest.jsonの署名を作る
2で指定したパスワード、3で取得した中間証明書と、4で取得した証明書、秘密鍵、
6で取得したmanifest.jsonを使い、opensslコマンドにて署名ファイルを作る。
openssl smime -binary -sign -certfile {中間証明書}.pem -signer {証明書}.pem -inkey {秘密鍵}.pem -in manifest.json -out signature -outform DER -passin pass:{パスワード}→ signatureができる
8.pkpassを作る
5の中身と、6のmanifest.json、7のsignatureを一つのディレクトリに配置してzipコマンドで固める。
zip -j hogehoge.pkpass ./*→ hogehoge.pkpass
9.iPhoneで表示させてみる。
iOS6じゃないとダメみたい。
メール等でhogehoge.pkpassを送信し、ダウンロードすると自動的に
passが表示される。表示されなかったらどこかが間違ってる。
起動して表示されてもまだ安心しちゃいけない。
「追加」ボタンを押して、passbookアプリにちゃんと追加されるかを確認する。
追加されなかったらどこかが間違ってる。
アメブロ初の投稿なので、見た目とかダメダメですみません。
以上、お疲れさまでした。