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 на хостинге по какой-то причине не обновляются вовремя, поэтому о таких моментах лучше узнавать заблаговременно.