ドメインやSSLサーバ証明書の有効期限が切れると目もあてられません。 ドメインについてはレジストラ、SSLサーバ証明書については認証局から期限が近付いている旨の案内がきますが、それでもやはり自分でも確認した方が安全です。
本記事ではそれらの有効期限のチェック用スクリプトを紹介します。 なお本記事で紹介するスクリプトは MIT License です。(利用自由、無保証)
whois の結果から調査します。 レジストラ毎に whois の出力結果が違うので、対応してない場合は適時修正してください。
時間表示用の LOCALE は自分の環境に合わせて修正してください。
domain-period-check.sh :
#! /bin/sh
#
# ドメインの有効期限を表示する
# Copyright (C) 2022 HIRAMOTO Kouji
#
# 実行例: domain-period-check.sh host1.example.com host2.example.com
#
#------------------------------------------------------------------------------
# This software is released under the MIT License.
# ライセンス全文: https://opensource.org/licenses/MIT
# 日本語訳: https://licenses.opensource.jp/MIT/MIT.html
LOCALE="ja_JP.UTF-8"
echo "ドメイン有効期限"
for DOMAIN in "$@" ; do
echo "----------------------------------------"
echo ドメイン: "$DOMAIN"
# .com
WHOIS=`env LANG=C LC_ALL=C /usr/bin/whois "$DOMAIN"`
EXPIRY_DATE=`echo "$WHOIS" | fgrep -i 'registry expiry date:' | expand | sed -e 's/^[^:]*: *//'`
if [ -z $EXPIRY_DATE ] ; then
# .jp
EXPIRY_DATE=`echo "$WHOIS" | fgrep -i '[state]' | expand | sed -e 's/.*(//;s/)//'`
fi
if [ -z $EXPIRY_DATE ] ; then
# 汎用 .jp
EXPIRY_DATE=`echo "$WHOIS" | fgrep -i '[expires on]' | expand | awk '{print $NF}'`
fi
EXPIRY_SEC=`/bin/date +%s --date="$EXPIRY_DATE"`
NOW_SEC=`/bin/date +%s`
DAYS=`expr \( $EXPIRY_SEC - $NOW_SEC \) / 86400`
REST=`env LANG=$LOCALE LC_ALL=$LOCALE /bin/date --date="$EXPIRY_DATE"`
echo 残り日数: $DAYS 日間 "($REST)"
done
同じ SSLサーバ証明書を使った複数のプロセスを動作させているでしょうから、証明書のファイルをチェックするのではなく各サービスポートに接続して調査します。 openssl コマンドを使います。
時間表示用の LOCALE は自分の環境に合わせて修正してください。
certificate-period-check.sh :
#! /bin/sh
#
# SSLサーバ証明書の有効期限を表示する
# Copyright (C) 2022 HIRAMOTO Kouji
#
# 実行例: certificate-period-check.sh host1.example.com:443:587:995 host2.example.com:587:995
# ホスト名の後に検査するポートを列挙してください。
#
#------------------------------------------------------------------------------
# This software is released under the MIT License.
# ライセンス全文: https://opensource.org/licenses/MIT
# 日本語訳: https://licenses.opensource.jp/MIT/MIT.html
LOCALE="ja_JP.UTF-8"
NOW_SEC=`date +%s`
echo "SSLサーバ証明書有効期限"
for HOST_PORT in "$@" ; do
HOST=`echo $HOST_PORT | sed -e 's/:.*//'`
PORT_LIST=`echo $HOST_PORT | sed -e 's/[^:]*://' | sed -e 's/:/ /g'`
echo "----------------------------------------"
echo "ホスト: $HOST"
for PORT in $PORT_LIST ; do
echo -n "ポート $PORT: "
OPTION=""
if [ $PORT -eq 587 -o $PORT -eq 25 ] ; then
OPTION="-starttls smtp"
fi
EXPIRY_DATE=`echo | openssl s_client -connect $HOST:$PORT $OPTION 2>/dev/null | openssl x509 -noout -dates | fgrep -i notAfter | sed -e 's/.*=//'`
EXPIRY_SEC=`date +%s --date="$EXPIRY_DATE"`
DAYS=`expr \( $EXPIRY_SEC - $NOW_SEC \) / 86400`
REST=`env LANG=$LOCALE LC_ALL=$LOCALE /bin/date --date="$EXPIRY_DATE"`
echo 残り日数: $DAYS 日間 "($REST)"
done
done
crontab に設定する例です。
時間、ホスト、ポート、メールアドレスは自分の環境に合わせて変更してください。 (Mail コマンドでメールが送信できるよう設定されている前提です)
0 8 * * 6 /usr/local/bin/certificate-period-check.sh host1.example.com:443:587:995 host2.example.com:587:995 | Mail -s 'certificate period check' 自分のメールアドレス
2 8 * * 6 /usr/local/bin/domain-period-check.sh host1.example.com host2.example.com | Mail -s 'domain period check' 自分のメールアドレス
こんなメールが届きます。
ドメイン有効期限
----------------------------------------
ドメイン: example.com
残り日数: 3146 日間 (2030年 8月 30日 金曜日 01:06:49 JST)
SSLサーバ証明書有効期限
----------------------------------------
ホスト: example.com
ポート 443: 残り日数: 88 日間 (2022年 4月 15日 金曜日 14:14:46 JST)
ポート 587: 残り日数: 88 日間 (2022年 4月 15日 金曜日 14:14:46 JST)
ポート 995: 残り日数: 88 日間 (2022年 4月 15日 金曜日 14:14:46 JST)
(以上)