flatray.com | 戻る 更新日時: 2022-01-17

ドメインやSSLサーバ証明書の有効期限をチェックする

ドメインや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サーバ証明書の有効期限

同じ 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)

(以上)