SSL
Jenkins

SSL証明書の有効期限チェック

BRIGHT VIE Advent Calendar 2017 - Qiita の7日目です!

アドベントカレンダーも1週間目!
今のところ走り続けれていますが、執筆が続いているためそろそろバテてきており...
今日は軽めな感じで。。。

はじめに

弊社でもパブリックな証明書やプライベート証明書など様々なタイプのSSL証明書を利用しているのですが、
組織としてきちんと動き出す以前は、SSLの証明書チェックが無かったり、
運用中にもかかわらず有効期限切らせてしまったりといったことが結構起きている状況でした;;

最近では、Let's Encryptなども利用しており、cronで更新処理を組み込んだりしてりおけば安心ですが、
念のため自動更新の場合でも正常に更新がされているのか、
手動の場合には更新し忘れがないかをチェックしたいといった場合はあるかと思います。

簡易的なチェック方法

弊社で利用している簡易的な有効期限のチェックはJenkinsさんが頑張ってくれています。
(実行環境は、 Amazon Linux AMIで、サーバのタイムゾーンがJST)

# 対象のドメインの有効期限を取得(GMT)
## (2018/03/11 EXPIREとなっていたのをEXPIREDに修正)
EXPIRED=`openssl s_client -connect 対象ドメイン:443 < /dev/null 2> /dev/null | openssl x509 -text | grep "Not After" | awk -F ' : ' '{print $2}'`

# 有効期限をUnixTimestamp形式で取得する(GMT)
EXPIRED_UNIXTIME=`date '+%s' -d "\`echo $EXPIRED\`"`

# 取得した有効期限はGMTであるため、日本標準時間のJSTに変更する
EXPIRED_UNIXTIME=`expr $EXPIRED_UNIXTIME - 32400`

# あと何日かを取得するために現在の時間をUnixTimestamp形式で取得する
NOW_UNIXTIME=`date "+%s"`

# 有効期限から今の時間を引くことで、残り時間をUnixTimestmap形式で計算する
DIFF_SECOND=`expr $EXPIRED_UNIXTIME - $NOW_UNIXTIME`

# 1日は、60秒*60分*24時間=86400秒
ONE_DAY_SECOND=86400

# 残り日数を取得する
DAYS=`expr $DIFF_SECOND / $ONE_DAY_SECOND`

# 残りの有効期限を表示
echo "残り有効期限は、${DAYS}日です。"

新しいドメインの発行と証明書を発行した際にドメインリストに登録してしまえば、
自動チェックの対象になるので何かと便利。

通知設定

また、有効期限が近づくと下記のようにSlackに通知するようにしたりしています。

Slack_SSLの有効期限チェック.png

これで、自動更新がうまく動いていなかった場合も検知できますし、
手動で更新しなければいけない部分にも漏れなく対応ができますね!
(ただし、DNSに設定時にチェック対象のリストに登録していれば...)

まとめ

簡単でしたが現状では上記で十分ですが、今後対象ドメイン数が増えてきたときに登録し忘れなどが起きるような気もしており...
このあたり、DNSから自動で取得してチェックを入れるような仕組みにしているほうが本当はもっと安心なんでしょうね。

時期を見てこのあたりもしっかり整備していければと思っております。