Страница 1 из 1

Контроль сертификатов OpenVPN и отчёт на почту об окончании срока действия сертификата

Добавлено: 15 июл 2025, 14:14
Padonak
Итак, понастроил VPN серверов тучу... И пришло время истечения сроков действия сертификатов пользователей. Причём в самые неподходящие моменты. Пришлось написать скрипт, отслеживающий сроки действия сертификатов и информирование об этом на почту.

место сохранения журнала отправленных уведомлений:

Код: Выделить всё

touch /var/log/openvpn/check-expare.log
Сам скрипт:

Код: Выделить всё

touch /etc/openvpn/check-expare.sh
chmod +x /etc/openvpn/check-expare.sh

Код: Выделить всё

#!/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
HOSTNAME=`cat /etc/hostname`
MAILADM=admin@padonak.su

# Указываем месторасположение файлов сертификатов
KEYS=/etc/openvpn/easy-rsa/pki/issued
# Указываем имя и местораположение индекса используемых сервером сертификатов
INDEX=/etc/openvpn/easy-rsa/pki/index.txt

# Указываем имя и месторасположение индекса рассылки
LOG=/var/log/openvpn/check-expare.log

# Задаём временные метки для инициирования высылки уведомления
AMONTH=2678400
AWEEK=604800
ATREEDAY=259200

# Запускаем перебор строк файла индекса (отрабатываем только задействованные, не отозванные)
cat $INDEX | grep '^V' | while read LINE
do

  # Получаем имя сертификата
  CN=`echo $LINE | awk '{print $5}' | cut -c 5-`

  # Получаем дату начала действия сертификата
  DFROM=`cat ${KEYS}/${CN}.crt | grep -i "Not Before" | awk 'match($0,/: .+/) {print substr($0, RSTART, RLENGTH)}' | cut -c 3- | rev | cut -c 1- | rev`
  # Получаем дату окончания действия сертификата
  DTO=`cat ${KEYS}/${CN}.crt | grep -i "Not After" | awk 'match($0,/: .+/) {print substr($0, RSTART, RLENGTH)}' | cut -c 3- | rev | cut -c 1- | rev`

  # Приводим значения полученных дат к единому образцу - времени, прошедшему от начала "эпохи" UNIX (seconds since 1970-01-01 00:00:00 UTC)
  DCURR=`date +%s`
  DFROM=`date --date="${DFROM}" +%s`
  DTO=`date --date="${DTO}" +%s`

 # Вычисляем, сколько секунд осталось до окончания действия сертификата
  DEXP=`expr ${DTO} - ${DCURR}`

  # Проверяем, не настало-ли время
  if [ ${DEXP} -lt ${ATREEDAY} ]
  then
    # Если событие по сроку информирования для проверяемого сертификата не зафиксировано, то делаем это
    if [ "`cat ${LOG} | grep -i ${CN} | grep -i ATREEDAY`" == "" ] || [ `cat ${LOG} | sort --reverse | grep -i ${CN} | grep -i --max-count=1 ATREEDAY | awk '{print $1}'` -lt ${DFROM} ]
    then
      # Высылаем уведомление на адрес электронной почты, указанный при создании сертификата
      echo -e "Content-Type: text/plain; charset="utf-8"\nSubject: Внимание!  VPN server ${HOSTNAME}  ключ для \"${CN}\"\nДо окончания срока действия сертификата (VPN) удалённого доступа осталось три дня." | sendmail -F${HOSTNAME} ${MAILADM}
      # Записываем в журнал событие
     echo "${DCURR}  ${CN}  ATREEDAY" >> ${LOG}
   fi
  else
    if [ ${DEXP} -lt ${AWEEK} ]
    then
      if [ "`cat ${LOG} | grep -i ${CN} | grep -i AWEEK`" == "" ] || [ `cat ${LOG} | sort --reverse | grep -i ${CN} | grep -i --max-count=1 AWEEK | awk '{print $1}'` -lt ${DFROM} ]
      then
        echo -e "Content-Type: text/plain; charset="utf-8"\nSubject: Внимание!  VPN server ${HOSTNAME} ключ для \"${CN}\"\nДо окончания срока действия сертификата (VPN) удалённого доступа осталась одна неделя." | sendmail -F${HOSTNAME}  ${MAILADM}
        echo "${DCURR}  ${CN}  AWEEK" >> ${LOG}
      fi
    else
      if [ ${DEXP} -lt ${AMONTH} ]
      then
        if [ "`cat ${LOG} | grep -i ${CN} | grep -i AMONTH`" == "" ] || [ `cat ${LOG} | sort --reverse | grep -i ${CN} | grep -i --max-count=1 AMONTH | awk '{print $1}'` -lt ${DFROM} ]
        then
          echo -e "Content-Type: text/plain; charset="utf-8"\nSubject: Внимание!  VPN server ${HOSTNAME} ключ для \"${CN}\"\nДо окончания срока действия сертификата (VPN) удалённого доступа остался один месяц." | sendmail -F${HOSTNAME} ${MAILADM}
          echo "${DCURR}  ${CN}  AMONTH" >> ${LOG}
        fi
      fi
    fi
  fi

done

exit 0
Записываем в cron

Код: Выделить всё

vim /etc/crontab

Код: Выделить всё

00 5 * * *  root /etc/openvpn/check-expare.sh > /dev/null 2>&1