Скрипт автоматического обновления списка отзыва сертификатов OpenVPN

Автоматическое обновление списка отзыва сертификатов

Эх, давно не брал я в руки карты, уже и движок сайта устарел, но тут пришлось вернутся к админским вопросам. В общем у одного из клиентов раз в 180 дней отвалилвался сервер Openvpn на debian и каналы между офисами падали. Оказалось что списки отзыва сертификатов, которые прописаны в конфиге, в положенный срок никто не обновляет.  Делать руками самому это не вариант, поэтому я набросал небольшой скрипт, сначала я сделал его для Debian, потом адаптировал под FreeBSD.

Для Debian:

Что делает скрипт: скрипт автоматически обновляет список отозванных сертификатов (CRL) созданный с помощью easy-rsa для OpenVPN, а именно:

  1. Проверяет срок действия текущего CRL (crl.pem) с помощью openssl.

  2. Определяет, сколько дней осталось до истечения (по дате Next Update).

  3. Обновляет CRL только при необходимости:

    • Если осталось 14 дней или меньше до окончания действия, либо если CRL отсутствует.

  4. Создаёт новый CRL командой:

    EASYRSA_BATCH=1 ./easyrsa gen-crl

  5. Копирует обновлённый CRL в /etc/openvpn/crl.pem, устанавливает правильные права и владельца.

  6. Перезапускает сервис OpenVPN через systemctl, чтобы изменения вступили в силу.

  7. Ведёт лог всех операций в /var/log/update_openvpn_crl.log.

Тело скрипта: 


#!/bin/bash
# Автоматическое обновление CRL через easy-rsa с проверкой срока действия
# Запускать через cron, например, раз в день
 
EASYRSA_DIR="/etc/openvpn/easy-rsa"        # Папка easy-rsa
CRL_SRC="$EASYRSA_DIR/pki/crl.pem"         # CRL, который генерирует easy-rsa
CRL_DST="/etc/openvpn/crl.pem"             # CRL, который использует OpenVPN
OPENVPN_SERVICE="openvpn@server"           # Название сервиса
LOG_FILE="/var/log/update_openvpn_crl.log"
DAYS_BEFORE_RENEW=14                       # За сколько дней до истечения обновлять
 
# --- Проверка наличия CRL ---
if [ ! -f "$CRL_SRC" ]; then
    echo "$(date) [-] CRL не найден, генерирую новый..." >> "$LOG_FILE"
    NEED_UPDATE=1
else
    # --- Проверка срока действия ---
    EXPIRY_DATE=$(openssl crl -in "$CRL_SRC" -noout -nextupdate | cut -d'=' -f2)
    EXPIRY_TIMESTAMP=$(date -d "$EXPIRY_DATE" +%s)
    NOW_TIMESTAMP=$(date +%s)
    DAYS_LEFT=$(( (EXPIRY_TIMESTAMP - NOW_TIMESTAMP) / 86400 ))
 
    echo "$(date) [*] До истечения CRL осталось $DAYS_LEFT дней." >> "$LOG_FILE"
 
    if [ "$DAYS_LEFT" -le "$DAYS_BEFORE_RENEW" ]; then
        NEED_UPDATE=1
    else
        NEED_UPDATE=0
    fi
fi
 
# --- Обновление при необходимости ---
if [ "$NEED_UPDATE" -eq 1 ]; then
    echo "$(date) [*] Генерирую новый CRL..." >> "$LOG_FILE"
    cd "$EASYRSA_DIR" || { echo "$(date) [-] Ошибка: нет директории $EASYRSA_DIR" >> "$LOG_FILE"; exit 1; }
 
    EASYRSA_BATCH=1 ./easyrsa gen-crl >> "$LOG_FILE" 2>&1
 
    if [ -f "$CRL_SRC" ]; then
        cp "$CRL_SRC" "$CRL_DST"
        chmod 644 "$CRL_DST"
        chown root:root "$CRL_DST"
 
        systemctl restart "$OPENVPN_SERVICE"
        echo "$(date) [+] CRL обновлён и OpenVPN перезапущен." >> "$LOG_FILE"
    else
        echo "$(date) [-] Ошибка: CRL не сгенерирован!" >> "$LOG_FILE"
        exit 1
    fi
else
    echo "$(date) [=] Обновление не требуется." >> "$LOG_FILE"
fi

Сделаем его исполняемым:

sudo chmod +x /usr/local/bin/easy_rsa_update_crl.sh

И добавим в cron c проверкой каждые 5 дней:

0 3 */5 * * /usr/local/bin/easy_rsa_update_crl.sh


Для Freebsd:

#!/bin/sh

# Автоматическое обновление CRL через easy-rsa (FreeBSD 13)

# Запускать через cron раз в 5 дней

 

EASYRSA_DIR="/usr/local/etc/openvpn/easy-rsa"  # Путь до easy-rsa (проверь у себя!)

CRL_SRC="$EASYRSA_DIR/pki/crl.pem"             # Исходный CRL, генерируемый easy-rsa

CRL_DST="/usr/local/etc/openvpn/crl.pem"       # CRL, который использует OpenVPN

OPENVPN_SERVICE="openvpn"                      # Название сервиса в FreeBSD

LOG_FILE="/var/log/update_openvpn_crl.log"

DAYS_BEFORE_RENEW=14                           # За сколько дней до истечения обновлять

 

NEED_UPDATE=0

 

# --- Проверка наличия CRL ---

if [ ! -f "$CRL_SRC" ]; then

    echo "$(date) [-] CRL не найден, генерирую новый..." >> "$LOG_FILE"

    NEED_UPDATE=1

else

    # --- Проверка срока действия ---

    EXPIRY_DATE=$(openssl crl -in "$CRL_SRC" -noout -nextupdate | cut -d'=' -f2)

    EXPIRY_TIMESTAMP=$(date -j -f "%b %e %T %Y %Z" "$EXPIRY_DATE" +%s)

    NOW_TIMESTAMP=$(date +%s)

    DAYS_LEFT=$(( (EXPIRY_TIMESTAMP - NOW_TIMESTAMP) / 86400 ))

 

    echo "$(date) [*] До истечения CRL осталось $DAYS_LEFT дней." >> "$LOG_FILE"

 

    if [ "$DAYS_LEFT" -le "$DAYS_BEFORE_RENEW" ]; then

        NEED_UPDATE=1

    fi

fi

 

# --- Обновление при необходимости ---

if [ "$NEED_UPDATE" -eq 1 ]; then

    echo "$(date) [*] Генерирую новый CRL..." >> "$LOG_FILE"

    cd "$EASYRSA_DIR" || { echo "$(date) [-] Ошибка: нет директории $EASYRSA_DIR" >> "$LOG_FILE"; exit 1; }

 

    EASYRSA_BATCH=1 ./easyrsa gen-crl >> "$LOG_FILE" 2>&1

 

    if [ -f "$CRL_SRC" ]; then

        cp "$CRL_SRC" "$CRL_DST"

        chmod 644 "$CRL_DST"

        chown root:wheel "$CRL_DST"

 

        service "$OPENVPN_SERVICE" restart

        echo "$(date) [+] CRL обновлён и OpenVPN перезапущен." >> "$LOG_FILE"

    else

        echo "$(date) [-] Ошибка: CRL не сгенерирован!" >> "$LOG_FILE"

        exit 1

    fi

else

    echo "$(date) [=] Обновление не требуется." >> "$LOG_FILE"

fi


Делаем исполняем и также добавлем в cron.

На этом все.

0
Голосов пока нет

Оставить комментарий