5.7 KiB
5.7 KiB
Инструкция: выпуск сертификата Let's Encrypt (DNS-01)
Универсальная инструкция для использования как промпт в следующих проектах. Подходит, когда HTTP-01 недоступен (порт 80 закрыт, блокировки, инстанс за NAT).
Когда использовать DNS-01
- HTTP-01 не срабатывает: таймаут, «Connection refused», порт 80 недоступен с интернета, провайдер или регион блокирует запросы от Let's Encrypt.
- DNS-01: проверка владения доменом по TXT-записи
_acme-challenge.<домен>. До сервера стучаться не нужно — важен только DNS.
Общий алгоритм
- Выбрать DNS-провайдера домена и проверить, есть ли у него API или плагин для certbot/acme.sh.
- Установить certbot и плагин для этого DNS (или использовать acme.sh с DNS API).
- Создать файл учётных данных (логин/API-токен провайдера), права 600.
- Запросить сертификат:
certbot certonly --authenticator dns-<провайдер> ... -d example.com. - Подложить полученные
fullchain.pemиprivkey.pemв reverse proxy (Nginx Proxy Manager, nginx, Caddy и т.д.). - Настроить автообновление (systemd timer certbot + deploy-hook при продлении).
Пример: Beget.com (certbot-dns-beget-api)
Условия: домен на Beget, доступ к API (логин + пароль или отдельный API-пароль).
-
Установка (Debian/Ubuntu):
apt install certbot pip3 install certbot-dns-beget-api # или: python3 -m pip install certbot-dns-beget-api --break-system-packages -
Файл учётных данных (например
/root/.secrets/certbot/beget.ini):dns_beget_api_username = ВАШ_ЛОГИН_BEGET dns_beget_api_password = ВАШ_ПАРОЛЬ_ИЛИ_API_ПАРОЛЬchmod 600 /root/.secrets/certbot/beget.ini -
Запрос сертификата:
certbot certonly \ --authenticator dns-beget-api \ --dns-beget-api-credentials /root/.secrets/certbot/beget.ini \ --dns-beget-api-propagation-seconds 120 \ -d example.com \ --non-interactive \ --agree-tos \ --email your@email.com -
Где лежат файлы после выпуска:
- Сертификат:
/etc/letsencrypt/live/<домен>/fullchain.pem - Ключ:
/etc/letsencrypt/live/<домен>/privkey.pem
- Сертификат:
-
Интеграция с Nginx Proxy Manager (NPM):
- Либо вручную скопировать в каталог custom_ssl (например
custom_ssl/npm-<id>/fullchain.pemиprivkey.pem) и перезагрузить nginx в контейнере NPM. - Либо добавить запись в БД NPM (таблица
certificate, providerother) и положить те же файлы в каталог, на который ссылается конфиг nginx (напримерcustom_ssl/npm-<certificate_id>/).
- Либо вручную скопировать в каталог custom_ssl (например
-
Продление и deploy-hook (чтобы после
certbot renewсертификат автоматически подхватывался NPM):# /etc/letsencrypt/renewal-hooks/deploy/copy-to-npm.sh # RENEWED_LINEAGE = путь к обновлённому сертификату, например /etc/letsencrypt/live/example.com if [ "$RENEWED_LINEAGE" = "/etc/letsencrypt/live/EXAMPLE_DOMAIN" ]; then cp "$RENEWED_LINEAGE/fullchain.pem" /path/to/npm/custom_ssl/npm-ID/ cp "$RENEWED_LINEAGE/privkey.pem" /path/to/npm/custom_ssl/npm-ID/ chmod 644 /path/to/npm/custom_ssl/npm-ID/fullchain.pem chmod 600 /path/to/npm/custom_ssl/npm-ID/privkey.pem docker exec CONTAINER_NPM nginx -s reload fiСделать скрипт исполняемым:
chmod +x ... -
Проверка автообновления: таймер certbot обычно уже включён:
systemctl list-timers | grep certbot
Другие DNS-провайдеры (идеи для промпта)
- Cloudflare:
certbot-dns-cloudflare, переменныеdns_cloudflare_api_tokenилиdns_cloudflare_email+dns_cloudflare_api_key. - Reg.ru: плагин
certbot-dns-regru, свои переменные в credentials-файле. - NIC.ru:
certbot-dns-nicru. - Без API:
certbot certonly --manual --preferred-challenges dns -d example.com— выводит TXT-значение, пользователь вручную добавляет запись в DNS, затем продолжает по Enter.
Краткий чеклист для нового домена/проекта
- Домен и DNS у одного провайдера; выяснить, есть ли API/плагин для ACME DNS-01.
- Установить certbot и нужный DNS-плагин.
- Создать credentials-файл (chmod 600), не коммитить в git.
- Выпустить сертификат:
certbot certonly --authenticator dns-... -d domain. - Подложить fullchain.pem и privkey.pem в reverse proxy.
- Добавить deploy-hook для продления и перезагрузки nginx/прокси.
- Убедиться, что certbot.timer включён для автоматического renew.