Skip to main content

Мониторинг срока истечения SSL-сертификатов (2 способа)

SSL-сертификаты для сайтов важно не забывать своевременно продлевать, поэтому я написал 2 варианта скрипта для проверки срока истечения. 1-й вариант — через обращение к самому сайту, 2-й вариант — через проверку файлов сертификатов в шаре (бывают случаи, когда к сайту в корпоративной сети нельзя обратиться напрямую с сервера мониторинга, но есть общая шара, в которую скидываются все сертификаты).

Способ 1

Обращаемся непосредственно к списку сайтов и проверяем их сертификат. Пример приведен для проверки с помощью Zabbix, поэтому скрипт /etc/zabbix/extscripts/check_domain_certificates_expiration.sh выглядит следующим образом:

#!/bin/bash
TIMESTAMP=`echo | date`
IFS=$'\r\n' read -d '' -r -a DOMAINS < /etc/zabbix/extscripts/check_domain_certificates_expiration_list.txt
EXPIRING=0
EXP_CERTS=()
# $1 or 14 days (by default) to alarm
#ALARM_DAYS=${1:-14}
# $2 for zabbix external checks
ALARM_DAYS=${2:-14}
for DOMAIN_STRING in "${DOMAINS[@]}"
do
    DOMAIN=`printf "${DOMAIN_STRING}" | cut -d';' -f1`
    CRT_PLACE=`printf "${DOMAIN_STRING}" | cut -d';' -f2`
    EXPIRE_DATE=`echo | openssl s_client -servername ${DOMAIN} -connect ${DOMAIN}:443 2>/dev/null | openssl x509 -enddate -noout 2>/dev/null | grep notAfter | cut -d'=' -f2`
    EXPIRE_SECS=`date -d "${EXPIRE_DATE}" +%s`
    EXPIRE_TIME=$(( ${EXPIRE_SECS} - `date +%s` ))
    if test $EXPIRE_TIME -lt 0
    then
        RETVAL=0
    else
        RETVAL=$(( ${EXPIRE_TIME} / 24 / 3600 ))
    fi
    if test $RETVAL -lt $ALARM_DAYS
    then
        ((EXPIRING++))
        EXP_CERTS+=("${DOMAIN} - certificate expires in $RETVAL days [${CRT_PLACE}]")
    fi
done
echo ${EXPIRING}
if test $EXPIRING -gt 0
then
    (echo "Subject:Check domain certificate(s) expiration"; echo "From:zabbix@yourdomain.ru"; echo "To:monitor@yourdomain.ru"; printf "Check ${EXPIRING} domain certificate(s) expiring:\n" && printf "%s\n" "${EXP_CERTS[@]}";) | /usr/sbin/sendmail -t
fi

Рядом кладем txt-файлик check_domain_certificates_expiration_list.txt со списком доменов и описанием (в описании можно указать, где необходимо обновить сертификат):

domain1.ru;Timeweb VDS
test.domain2.ru;Timeweb hosting
domain3.ru;Server_name1

Способ 2

В этом варианте мы копируем по крону сертификаты с необходимых серверов в шару /mnt/certificates/server_name (под каждый сервер создаем отдельную поддиректорию), шару /mnt/certificates монтируем к серверу мониторинга и выдаем доступ на чтение. Пример так же для Zabbix, поэтому скрипт /etc/zabbix/extscripts/check_certificates_expiration.sh выглядит следующим образом:

#!/bin/bash
TIMESTAMP=`echo | date`
# uncomment the next line if files listing not working:
#shopt -s nullglob
CERTIFICATES=(/mnt/certificates/*/*)
EXPIRING=0
EXP_CERTS=()
# $1 or 14 days (by default) to alarm
#ALARM_DAYS=${1:-14}
# $2 for zabbix external checks
ALARM_DAYS=${2:-14}
for CERTIFICATE in "${CERTIFICATES[@]}"
do
    EXPIRE_DATE=`echo | openssl x509 -in "${CERTIFICATE}" -enddate -noout 2>/dev/null | grep notAfter | cut -d'=' -f2`
    EXPIRE_SECS=`date -d "${EXPIRE_DATE}" +%s`
    EXPIRE_TIME=$(( ${EXPIRE_SECS} - `date +%s` ))
    if test $EXPIRE_TIME -lt 0
    then
        RETVAL=0
    else
        RETVAL=$(( ${EXPIRE_TIME} / 24 / 3600 ))
    fi
    if test $RETVAL -lt $ALARM_DAYS
    then
        ((EXPIRING++))
        EXP_CERTS+=("${CERTIFICATE} expires in $RETVAL days")
    fi
done
echo ${EXPIRING}
if test $EXPIRING -gt 0
then
    (echo "Subject:Check certificate(s) expiration"; echo "From:zabbix@yourdomain.ru"; echo "To:monitor@yourdomain.ru"; printf "Check ${EXPIRING} certificate(s) expiring:\n" && printf "%s\n" "${EXP_CERTS[@]}";) | /usr/sbin/sendmail -t
fi

В обоих вариантах результаты проверки отправляются на почту (не забудьте предварительно настроить sendmail на сервере), если найдены сертификаты со сроком истечения менее 14 дней. Если настроить проверку в Zabbix (например, раз в 8 часов), то помимо писем на почту будет выводиться еще и триггер.

P.S. Сертификаты от Let’s Encrypt можно продлевать в автоматическом режиме, но это не всегда подходит (в моем случае на некоторые сервера в компании нельзя устанавливать Python, т.к. ломаются системные зависимости, а также есть сертификаты, которые необходимо раскидывать сразу на несколько серверов и выполнять reload для nginx), также бывают случаи, когда сертификаты через Let’s Encrypt на хостинге по какой-то причине не обновляются вовремя, поэтому о таких моментах лучше узнавать заблаговременно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *