エンジニア

2016.10.20

iOSアプリの証明書とプロビジョニングプロファイルの有効期限が後何日で切れるかを毎週自動でSlackに通知してみた

ios-cers-and-profiles-bot
はじめまして。三井田(みいだ)です。
4月に新卒としてハンズラボに入社して、早半年がたちました。
大学時代は授業で情報科学などを勉強する傍ら、UnityでモバイルARアプリを開発したり、個人開発のAndroidアプリをGoogle Playに公開したりしていました。
入社後は、新人研修の仮想プロジェクトでひたすらjQueryを書き続ける日々を送った後、現在のチームに配属され、DynamoDBを管理したり、PythonでLambdaを書いたり、PHPとJSで管理画面をより使いやすく改善したりしています。
さて、今回は多くのiOS開発者を悩ませる(?)、iOSアプリの証明書とプロビジョニングプロファイルについてのお話です。

やばい!iOSアプリの証明書の有効期限がっ…!!

1年に1回更新しなければならない、iOSアプリの証明書とプロビジョニングプロファイル。ついつい有効期限を忘れてしまい、期限が切れる直前(もしくは切れた後)に慌てて更新、なんてことはありませんか?
弊社でも先日、とあるiOSアプリの証明書の有効期限が切れる寸前になっていました。
その時は弊社エンジニアが気づき、緊急アップデートを行って難を逃れたのですが、もし気づくのが遅れて、証明書の有効期限が切れてしまっていたら。。。と思うとゾッとします。
そこで、iOSアプリの証明書、プロビジョニングプロファイルの更新忘れを防ぐために、証明書、プロビジョニングプロファイルの有効期限が後何日で切れるかを、毎週自動でSlackに通知するようにしてみました!

こんな感じです

ios-certificates-and-profiles-bot
毎週指定の時刻になると、管理サーバーでシェルスクリプトが自動実行されます(cron)。
スクリプトでは、証明書、プロビジョニングプロファイルの入ったプライベートリポジトリをgit pullした後、リポジトリ内の各.cer、.mobileprovisionファイルについて、後何日で有効期限が切れるのかを計算し、その結果をSlackに通知します。
【**注意!**】証明書、プロビジョニングプロファイルは厳重に管理してください!
スクリプトのソースコードはこちら(GitHub)です。(Linux環境用です。ローカルのMacで実行したい場合は、「$ brew install coreutils」を行った後、「date」コマンドの代わりに「gdate」コマンドを使えば実行できます。)
流れとしては、iOSアプリ証明書の有効期限を取得し、「年/月/日」の形にした後、

expiration_time=`openssl x509 -inform der -noout -dates -in "${cer_path}" | grep '^notAfter=' | sed -e 's/^notAfter=//'`
expiration_date=`date --date "${expiration_time}" "+%Y/%m/%d"`

後何日で有効期限が切れるのかを計算します。

today=`date "+%Y/%m/%d"`
op_expire=`date +%s --date "${expiration_date}"`
op_today=`date +%s --date "${today}"`
echo "scale=0; ($op_expire - $op_today) / 3600 / 24" | bc

そしてその結果を、Slackに投稿します。

curl -X POST --data-urlencode "payload={\"channel\": \"${channel}\", \"username\": \"${username}\", \"icon_emoji\": \"${icon_emoji}\", \"text\": \"${text}\"}" ${webhookurl}

プロビジョニングプロファイルについても有効期限を取得し、同様の処理を行います。(弊社iOSエンジニア駒場に有効期限の取得方法を教えてもらいました!)

expiration_time=`openssl smime -inform der -verify -noverify -in "${profile_path}" | grep -A1 ExpirationDate | grep '' | sed 's/\(.*\)<\/date>/\1/'`

30日以内に有効期限が切れる場合は、アイコンと文言を変えるようにしました。

if [ "${days_left}" -le "${warning_day}" ] ; then
icon_emoji=":exclamation:"
text="<!here> やばいよ、やばいよ! *""${name}""* は後 *""${days_left}""日* で有効期限が切れちゃうよ!早く証明書を更新して!!(有効期限:""${expiration_date}"")"
fi

emergency

【おまけ】有効期限が切れると…

expired
…切れないように気をつけましょう。

まとめ

iOSアプリの証明書とプロビジョニングプロファイルが後何日で切れるのか、Slackに毎週自動で通知されるようになったので、余裕をもって年次更新を行うことができるようになりました!
また、Slackに通知することで、特定の開発者だけが有効期限を把握するのではなく、より多くの人の目で期限をチェックできるのも良いですね!
それでは、今回はこの辺で。
Happy Coding! 😉

参考

一覧に戻る