Рубрики
SOFTWARE Вольер с пингвинами

Wildcard сертификат от Let’s Encrypt

Wildcard сертификат является удобным решением в случае, когда к одному домену привязаны множество сервисов, так как выпуск single domain сертификатов для каждого из них является трудозатратной задачей и образует множество потенциальных точек отказа при автоматизации.

Введение

Let’s Encrypt — некоммерческий удостоверяющий центр, который выдает SSL-сертификаты бесплатно. Каждый сертификат выпускается со сроком жизни 90 дней.

По уровню проверки данный центр выпускает DV сертификаты (Domain Validation) — проверка владения проходит автоматически с помощью файла на сервере или DNS записи. DV в отличии от Organization/Extended/Individual validation легко автоматизируется.

Охват сертификата по количеству доменов и поддоменов определяется следующими категориями:

  • single domain — защищает одно доменное имя;
  • wildcard — защищает основной домен и все его поддомены первого уровня;
  • multi-domain — защита нескольких разных доменов общим сертификатом.

Важное замечание: для подтверждения владения доменом при создании wildcard домена необходимо использовать DNS-01 challenge — создание TXT-записи домена со специальным содержимым.

Wildcard сертификат является удобным решением в случае, когда к одному домену привязаны множество сервисов, так как выпуск single domain сертификатов для каждого из них является трудозатратной задачей и образует множество потенциальных точек отказа при автоматизации.

Установка Certbot

Certbot — бесплатная консольная утилита с открытым исходным кодом, предназначенная для автоматизации получения и обновления SSL-сертификатов.

Ubuntu:

sudo apt install certbot

Fedora:

sudo dnf install certbot

Arch Linux:

sudo pacman -S certbot

Примечание: для автоматизации выдачи single domain сертификатов через nginx необходим пакет python3-certbot-nginx.

Для автоматизации выпуска wildcard сертификатов необходим пакет certbot-dns-multi — сторонний плагин, который интегрирует библиотеку lego, для взаимодействия с DNS записями провайдеров. В заметке рассматривается reg.ru.

Для Ubuntu и Fedora используется snap:

sudo snap install certbot-dns-multi

Для Arch Linux используется yay (или любой другой AUR пакетный менеджер):

yay -S certbot-dns-multi

Ручная генерация wildcart сертификата

При ручной генерации wildcart сертификата необходимо будет добавить TXT-записи через панель управления DNS провайдера. Пример представлен на рисунках 1.

Рисунок 1 — Панель управления DNS записями

Для ручной генерации wildcard сертификата используется следующая команда:

sudo certbot certonly --manual \
  --preferred-challenges dns \
  -d '*.yourdomain.com' -d yourdomain.com

В данной команде используются следующие флаги:

  • --manual — определяет ручной режим создания сертификата;
  • --preferred-challenges dns — определяет предпочтительный способ подтверждения владения доменом;
  • -d '*.yourdomain.com' -d yourdomain.com — определяет домены, для которых будет выпущен сертификат.

В процессе генерации будет предложено разместить две TXT-записи на поддомене _acme-challenge.yourdomain.com. Необходимо добавить обе и подождать некоторое время, пока записи будут доступны. Пример вывода команды представлен на рисунке 2.

Рисунок 2 — Пример вывода при ручной генерации wildcard сертификата

Для проверки добавленных записей можно использовать предложенную ссылку: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.yourdomain.com. Пример представлен на рисунке 3.
Или https://dnschecker.org/#TXT/_acme-challenge.yoursite.com, который предоставляет визуальную карту с DNS-зеркалами по всему миру. Пример представлен на рисунке 4.

Рисунок 3 — Пример проверки на сайте toolbox.googleapps.com
Рисунок 4 — Пример проверки на сайте dnschecker.org

После того, как записи стали доступны можно нажать Enter для последней проверки.

Примечание: время обновления обычно занимает от 5 до 15 минут.

Важное замечание: в случае не успешной проверки необходимо удалить старые записи и начать процедуру сначала.

После успешного выпуска обновленных сертификатов необходимо не забыть перезапустить nginx:

sudo systemctl restart nginx

Автоматическая проверка wildcard сертификатов

Как было сказано ранее в секции про установку certbot — для автоматического добавления TXT-записей будет использован пакет certbot-dns-multi на примере reg.ru.

Для безопасности добавим альтернативный пароль, который будет использоваться для взаимодействия с API reg.ru, а так же добавим доверенный IP-адрес, с которого разрешено взаимодействие с API. Пример изображен на рисунке 5.

Рисунок 5 — Пример настройки API reg.ru

Сохраним реквизиты для доступа к API в файл командой:

sudo nano /etc/letsencrypt/regru.env

Содержимое файла должно иметь следующий вид:

dns_multi_provider = regru
REGRU_USERNAME=your@email.com
REGRU_PASSWORD=********************************

Для безопасности ограничим доступ к файлу:

sudo chown root /etc/letsencrypt/regru.env
sudo chmod 600 /etc/letsencrypt/regru.env

Теперь можно выполнить команду certbot с заданными параметрами:

sudo certbot certonly \
        --authenticator dns-multi \
        --dns-multi-credentials /etc/letsencrypt/regru.env \
        -d "yourdomain.com" -d "*.yourdomain.com" \
        --dns-multi-propagation-seconds 900

В данной команде используются следующие флаги:

  • --authenticator dns-multi — определяет плагин, который будет использован для авторизации у провайдера DNS;
  • --dns-multi-credentials /etc/letsencrypt/regru.env — задает файл с реквизитами для авторизации;
  • -d "yourdomain.com" -d "*.yourdomain.com" — определяет домены, для которых будет выпущен сертификат;
  • --dns-multi-propagation-seconds 900 — задает время ожидания обновления DNS записей (15 минут).

После успешного выпуска обновленных сертификатов необходимо не забыть перезапустить nginx:

sudo systemctl restart nginx 

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

Для автоматического продления можно использовать готовый systemctl таймер от certbot, который можно включить с помощью:

sudo systemctl enable --now certbot-renew.timer

Для автоматического перезапуска nginx добавим хук к certbot:

sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

Данный хук должен иметь следующее содержимое:

#!/bin/bash
systemctl reload nginx

Осталось пометить файл исполняемым:

sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

Для проверки работы можно выполнить команду, которая симулирует работу по перевыпуску сертификатов:

sudo certbot renew --dry-run

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

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

Управление cookie