Введение
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.

Для ручной генерации 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.

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


После того, как записи стали доступны можно нажать Enter для последней проверки.
Примечание: время обновления обычно занимает от 5 до 15 минут.
Важное замечание: в случае не успешной проверки необходимо удалить старые записи и начать процедуру сначала.
После успешного выпуска обновленных сертификатов необходимо не забыть перезапустить nginx:
sudo systemctl restart nginx
Автоматическая проверка wildcard сертификатов
Как было сказано ранее в секции про установку certbot — для автоматического добавления TXT-записей будет использован пакет certbot-dns-multi на примере reg.ru.
Для безопасности добавим альтернативный пароль, который будет использоваться для взаимодействия с API reg.ru, а так же добавим доверенный IP-адрес, с которого разрешено взаимодействие с API. Пример изображен на рисунке 5.

Сохраним реквизиты для доступа к 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