こんにちわ、どばきちです。
SSLサーバー証明書の更新期限を忘れていて、ある日突然、本番サーバーでアクセス障害を起こしたことはないでしょうか。僕はあります。。実際に有効期限が切れてしまってから対応すると大変です。今すぐ復旧しなければいけないのに、以下のような対応が必要になります。
- CSRの作成(SSLサーバー証明書の作成に必要になります)
- SSLサーバー証明書を購入(会社の場合、経理部門などに決済を依頼する申請などあって時間がかかる場合も)
- SSLサーバー証明書をロードバランサ、CDNなどに設定が必要
特に証明書の購入がすぐできる訳ではないということがあるかと思います。
AWSのACMの様に自動更新してくれる様であれば良いのですが、全てがそういう訳でもないので、その時の教訓を踏まえて簡単にSSLサーバー証明書の更新期限を把握できる、エンジニア以外でも気づく仕組みの作り方についてご紹介できたらな、と思います。
SSLサーバー証明書の更新期限通知の概要
個別に話に入る前に全体について触れたいと思います。以下の様な流れを想定しています。
- 何かしらのCLIコマンドでSSLサーバー証明書の有効期限情報を取得する
- 有効期限の日付から残日数を計算する
- Slackに通知する
SSLサーバー証明書の更新期限をCLIから取得する
以下に具体的な例を載せたいと思います。
open_sslを利用する例(ドメインを差し替えると他のドメインでも利用できます)
❯ openssl s_client -connect "dubakichi.com":443 < /dev/null 2> /dev/null | openssl x509 -text | grep "Not After" | awk '{ print($4 " " $5 " " $6 " " $7 " " $8) }' | xargs -I {} gdate +"%Y-%m-%d %H:%M:%S" -d {}
2022-05-27 18:36:04
curlでも同様に取得することができます
❯ curl -v "https://dubakichi.com" 2>&1 1> /dev/null | grep "expire date:" | grep 'expire date:' | awk '{ print($4 " " $5 " " $6 " " $7 " " $8)}' | xargs -I {} gdate +"%Y-%m-%d %H:%M:%S" -d {}
2022-05-27 18:36:04
※ Macの環境でgdate(GNUのdateコマンドをインストール)を利用しています。linux環境であれば、gdateに置き換えると動くと思います(動かなかったらごめんなさい。。
このコマンド例で実施していることはどちらも以下の様な内容となります。
- open_ssl もしくはcurlコマンドの出力結果からSSLサーバー証明書の有効期限のみを抽出する
- GMTで出力される時刻をJSTに変換する
有効期限の日付から残日数を計算する
シェルスクリプトで対応する場合の例を記載します。
today=`gdate +"%Y-%m-%d %H:%M:%S"`
echo "today:" $today;
echo "expire:" $expire_date; // 先程ご紹介したコマンドで取得した有効期限
expire_unix_time=`gdate +%s --date "$expire_date"`;
today_unix_time=`gdate +%s --date "$today"`;
diff=$(($expire_unix_time-$today_unix_time));
days_left=$(($diff / (60 * 60 * 24)));
echo "残日数:" $days_left;
現時点と有効期限をunixtimeに変換してその差分で残りの日数を算出しています。
Slackへの通知
通知するために必要な情報が揃ったので後はSlack、Chatwork、メールなどに通知するだけです。
今回はSlackへの通知についてまた別記事にまとめようかと思います。
僕の様にある日突然の本番環境の不具合に見舞われて苦しむ人がいなくなることを心から願っています。
それでは、また!
この記事へのコメントはありません。