シェルからpkpassを作る | 仕事たのしいなーもー

仕事たのしいなーもー

SEブログです。日々の発見や関心を掲載しています。


シェルから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

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}
→ manifest.jsonができる

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アプリにちゃんと追加されるかを確認する。
追加されなかったらどこかが間違ってる。

アメブロ初の投稿なので、見た目とかダメダメですみません。
以上、お疲れさまでした。