iOSプッシュ通知用SSL証明書の有効期限をシェルスクリプトで監視する。


経緯

先日、iOS向けプッシュ通知用SSL証明書の有効期限が切れており、
慌てて証明書の再作成と監視の実装を行いました。

意外にも、iOS向けプッシュ通知用SSL証明書の有効期限監視の情報出てこなくて困りました。
なので、備忘兼/誰かのお役に立てればと…。

ちなみに、プッシュ通知用のサーバに以下のログが出ており、
ログ監視していたおかげで気づくことができました。危なかった…。
※いや手遅れだったのだけれども。。。

ERROR: Unable to connect to 'ssl://gateway.push.apple.com:2195'

前提(2015/10/13追記)

Appleのプッシュ通知サーバとやり取りするサーバに下記が入っていること。

  • プッシュ通知用SSL証明書
  • bcコマンド、exprコマンド
  • opensslコマンド
  • nrpe(Nagiosを使用する場合)
  • slack通知用のスクリプト(slackへの通知をする場合)

Nagiosサーバがあること(Nagiosで監視する場合のみ)

監視方法(概要)

SSL証明書の有効期限監視?そんなのNagiosのcheck_httpプラグインでチョロいっす!

…と言いたいところですが、今回監視したいのはAppleのプッシュ通知サーバとやり取りするための証明書の有効期限。
WEBサーバのSSL証明書の有効期限ではないので、check_httpでは監視できません。。

なので、

  1. opensslコマンドで有効期限を引っ張る。
  2. dateコマンドでUNIX_TIMEに変換。
  3. 引き算&割り算して残り何日か計算し、if文で判定して結果をNagiosに返す。

というスクリプトを作成しました。

拙作なサンプルスクリプト

参考にさせていただいた記事

監視方法詳細

1.opensslコマンドで証明書の有効期限を引っ張ります。

# openssl x509 -in <証明書ファイルのパス> -text |sed -e '/Not After/{s/^.* : //;p};d'  
Jun 13 09:50:42 2016 GMT
# 

2.後で残り何日?って計算したいので、UNIX_TIMEに変換します。

# date '--date=Jun 13 09:50:42 2016 GMT' +%s
1465811442
#

3.現在の日付を取得してUNIX_TIMEに変換します。

# date +%s
1444651962
#

4.bcコマンドで引き算して、残り日数(秒数)を求めます。
※後から気づいたけど、ここもexprで良い気がする。最初違うやり方でやろうとしてた際の名残ですね。。。

# echo 1465811442 - 1444651701|bc
21159741
#

5.有効期限(秒数)を日数に変換します。

# expr 21159741 / 86400
244
#

6.後はお決まりのif文で判定して、nagiosが判定出来るように終了コードを返してやれば終わりです。

  • 2015/10/12 21:34追記

  • 蛇足ですが、nagiosは以下のようにステータス判定します。

終了コード0…正常
終了コード1…warning
終了コード2…critical
その他…unknown

最後、駆け足になってしまいましたが、こんな感じです。
もっとスマートなやり方等あれば、是非ご指摘ください。

通知をslackに飛ばしたい時(2015/10/13追記)

Nagiosとか立ててないよ!って場合には、以下のような感じでslackにでも飛ばしてあげましょう。

### Main Routine
if [ "${DAYS_LEFT}" -le 15 ]; then
        ./slack.sh "NG" "NG - ${CERT_FILE} is remind ${DAYS_LEFT} days. Expire Date is ${JST_DATE}"
        exit 2;
elif [ "${DAYS_LEFT}" -le 30 ]; then
        ./slack.sh "NG" "NG - ${CERT_FILE} is remind ${DAYS_LEFT} days. Expire Date is ${JST_DATE}"
        exit 1;
else
        ./slack.sh "OK" "OK - ${CERT_FILE} is remind ${DAYS_LEFT} days. Expire Date is ${JST_DATE}"
        exit 0;
fi

slack通知のサンプルスクリプト

https://github.com/koitatu/zabbix_scripts/blob/master/slack.sh

分かりやすいslack通知導入の記事

http://codenote.net/slack/2768.html (2015/11/01 修正 inncoming Webhookなのでこっちでしたorz)

http://lab.aratana.jp/entry/2014/12/05/124822  (incomming Webhookじゃないならこっち)

Nagiosとの連携だけど、非常に分かりやすい記事です。