Как стать автором
Обновить

Как настроить автоматическое обновление SSL-сертификатов Let’s Encrypt с помощью Certbot на Ubuntu

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров5.4K

Допустим, вы не девопс. Вы — вполне себе фронтендер, бэкендер, может даже мобильщик. Но вот беда: у вас сервер, и ему нужен SSL. А девопс уехал в отпуск. Или вообще не нанят. И вот вы стоите, глядите на терминал и думаете: «Ну всё, теперь я — DevOps». 😅

Пугаться не стоит. Сегодня расскажу, как быстро и автоматически настроить SSL-сертификаты от Let’s Encrypt с помощью Certbot на Ubuntu. С шутками, примерами и bash-магией.


🔒 Зачем нужен Certbot и Let’s Encrypt?

Let’s Encrypt — это бесплатный центр сертификации. Он позволяет выпускать SSL-сертификаты для HTTPS. Certbot — это утилита для автоматического получения и обновления этих сертификатов.

Комбо для тех, кто не хочет возиться с ручной генерацией ключей и походами в коммерческие CA.


🚀 Установка Certbot

sudo apt update
sudo apt install certbot

Важно: Certbot нужно запускать на том же сервере, для которого вы хотите выпустить сертификат.


📜 Получение сертификата (и вывод информации о текущих сертификатах)

sudo certbot certonly --standalone -d project.com -d www.project.com
sudo certbot certificates
  • --standalone означает, что Certbot временно поднимет собственный сервер на 80 порту для валидации домена.

  • Проверьте, что порт 80 не занят! Иначе ничего не заработает.

    Если там ваш Nginx или Docker — остановите его на время выполнения команды:

sudo systemctl stop nginx

Альтернатива: можно использовать плагин webroot — он не требует остановки сервиса и просто создаёт специальный файл в директории сайта.

Подробнее про плагины — в официальной документации.


⏱ Автоматическое обновление через systemd

После установки Certbot автоматически добавляет systemd-таймер:

systemctl list-timers | grep certbot

Пример вывода:

Mon 2025-03-10 03:12:00 UTC  10h left  Mon 2025-03-09 03:12:00 UTC  certbot.timer  certbot.service

Проверить, что автообновление работает:

sudo certbot renew --dry-run

Если всё хорошо:

Certbot dry-run was successful.

Логи последних обновлений:

journalctl -u certbot.service --no-pager --since "2 days ago"

Напоминание: Certbot обновляет сертификаты только если до их окончания < 30 дней.


🕰️ Альтернатива: обновление через Cron

Иногда systemd-таймеры неудобны, особенно если вы настраиваете всё через Ansible или shell-скрипты. В этом случае можно использовать Cron.

  1. Отключаем таймер:

sudo systemctl stop certbot.timer
sudo systemctl disable certbot.timer
  1. Добавляем Cron-задачу:

sudo crontab -e

Пример:

0 0 1 * * /usr/bin/certbot renew --standalone --quiet

Чтобы узнать точный путь к certbot, используйте:

which certbot

⚙️ Хуки для перезапуска сервисов

Certbot умеет выполнять действия до, после или только при успешном обновлении сертификата. Это удобно, если нужно остановить сервис, скопировать сертификаты или перезапустить сервер.

# /etc/letsencrypt/renewal/project.com.conf

pre_hook = systemctl stop my-project.service
deploy_hook = systemctl reload my-project.service
post_hook = systemctl start my-project.service

🛠️ Скрипт на все случаи жизни

Вместо описания всего в кроне, можно создать bash-скрипт, который будет:

  1. Останавливать сервис

  2. Обновлять сертификаты

  3. Копировать файлы в нужное место

  4. Ставить права

  5. Запускать сервис обратно

#!/bin/bash

APP_PATH="/home/projects/project"
DOMAIN="project.com"

FULL_CHAIN_SRC="/etc/letsencrypt/live/${DOMAIN}/fullchain.pem"
PRIVATE_KEY_SRC="/etc/letsencrypt/live/${DOMAIN}/privkey.pem"
FULL_CHAIN_DIST="${APP_PATH}/volumes/etc/ssl/certs/project_com.full.crt"
PRIVATE_KEY_DIST="${APP_PATH}/volumes/etc/ssl/private/project_com.key"

echo "Starting script execution: $(date "+%Y-%m-%d %H:%M:%S")"

echo "Stopping the service..."
systemctl stop my-project.service

echo "Renewing the certificates..."
/usr/bin/certbot renew --standalone --quiet
/usr/bin/certbot certificates

echo "Copying the certificates to the project..."
cp -f "$FULL_CHAIN_SRC" "$FULL_CHAIN_DIST"
cp -f "$PRIVATE_KEY_SRC" "$PRIVATE_KEY_DIST"

echo "Setting correct permissions for the certificates..."
chmod 644 "$FULL_CHAIN_DIST"
chmod 644 "$PRIVATE_KEY_DIST"

echo "Running the service..."
systemctl start my-project.service

echo "End of script execution: $(date "+%Y-%m-%d %H:%M:%S")"

А в кроне вызываем его так:

0 0 1 * * sh /home/projects/project/cert-renew.sh >> /var/log/project-cert-renew.log 2>&1

🧠 Заключение

Иногда даже разработчику приходится немного быть девопсом. Главное — не бояться терминала и знать, где гуглить. А ещё — не забыть проверить через полгода, что автообновление всё ещё работает. 😁

Если вы нашли ошибку или хотите поделиться своим способом автоматизации — велком в комментарии!

Теги:
Хабы:
-2
Комментарии11

Публикации