Скрипт автоматического обновления списка отзыва сертификатов OpenVPN
Автоматическое обновление списка отзыва сертификатов
Эх, давно не брал я в руки карты, уже и движок сайта устарел, но тут пришлось вернутся к админским вопросам. В общем у одного из клиентов раз в 180 дней отвалилвался сервер Openvpn на debian и каналы между офисами падали. Оказалось что списки отзыва сертификатов, которые прописаны в конфиге, в положенный срок никто не обновляет. Делать руками самому это не вариант, поэтому я набросал небольшой скрипт, сначала я сделал его для Debian, потом адаптировал под FreeBSD.
Для Debian:
Что делает скрипт: скрипт автоматически обновляет список отозванных сертификатов (CRL) созданный с помощью easy-rsa для OpenVPN, а именно:
-
Проверяет срок действия текущего CRL (crl.pem) с помощью openssl.
-
Определяет, сколько дней осталось до истечения (по дате Next Update).
-
Обновляет CRL только при необходимости:
-
Если осталось 14 дней или меньше до окончания действия, либо если CRL отсутствует.
-
-
Создаёт новый CRL командой:
EASYRSA_BATCH=1 ./easyrsa gen-crl
-
Копирует обновлённый CRL в /etc/openvpn/crl.pem, устанавливает правильные права и владельца.
-
Перезапускает сервис OpenVPN через systemctl, чтобы изменения вступили в силу.
-
Ведёт лог всех операций в /var/log/update_openvpn_crl.log.
Тело скрипта:
Сделаем его исполняемым:
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.
На этом все.
Оставить комментарий