SSL-сертификаты через DNS: автоматизация выпуска Let’s Encrypt

Опубликовано 04.10.2025

SSL-сертификаты через DNS: автоматизация выпуска Let’s Encrypt

Введение

Let’s Encrypt — стандарт для получения бесплатных TLS-сертификатов. Чаще всего сертификаты выпускаются через метод HTTP-01, который требует доступного веб-сервера на порту 80. Однако для внутренних сервисов или wildcard-сертификатов (например, *.example.com) удобнее использовать DNS-01, который подтверждает владение доменом через TXT-записи в DNS и не требует открытых портов.

В статье разбираются:

  • Выпуск сертификатов через Cloudflare API,
  • Выпуск сертификатов через Amazon Route 53 (AWS),
  • Интеграция с веб-серверами Nginx, HAProxy и Traefik,
  • Автоматизация продления сертификатов.

Примечание: Инструкции актуальны для Certbot 2.x, acme.sh 3.x, Nginx 1.18+, HAProxy 2.4+, Traefik 2.x на Linux (Ubuntu/Debian). Для других ОС или версий инструментов могут потребоваться корректировки.


Cloudflare

1. Создание API-токена

  1. Войдите в Cloudflare → API TokensCreate Token.
  2. Используйте шаблон Edit zone DNS с правами:
    • Zone.DNS:Edit
    • Zone.Zone:Read
  3. Ограничьте токен конкретной зоной.
  4. Сохраните токен в защищённом месте (секреты CI/CD, переменные окружения).

⚠️ Утечка токена даёт полный контроль над DNS-зоной.

2. Установка Certbot и плагина

Ubuntu/Debian:

sudo apt-get update
sudo apt-get install -y certbot python3-certbot-dns-cloudflare

CentOS/Fedora:

sudo dnf install -y certbot python3-certbot-dns-cloudflare

Через snap:

sudo snap install --classic certbot
sudo snap install certbot-dns-cloudflare

3. Настройка токена

Файл /etc/letsencrypt/cloudflare.ini:

dns_cloudflare_api_token = YOUR_CF_API_TOKEN

Права:

sudo chown root:root /etc/letsencrypt/cloudflare.ini
sudo chmod 600 /etc/letsencrypt/cloudflare.ini

4. Выпуск сертификата

sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
  -d example.com -d '*.example.com' \
  --non-interactive

AWS Route 53

1. Настройка IAM-прав

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

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "route53:ChangeResourceRecordSets",
        "route53:ListHostedZones",
        "route53:ListResourceRecordSets"
      ],
      "Resource": "arn:aws:route53:::hostedzone/<YOUR_HOSTED_ZONE_ID>"
    }
  ]
}

Настройте профиль AWS CLI:

aws configure --profile certbot

Укажите AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY и регион (например, us-east-1).

2. Установка плагина

Ubuntu/Debian:

sudo apt-get install -y certbot python3-certbot-dns-route53

CentOS/Fedora:

sudo dnf install -y certbot python3-certbot-dns-route53

3. Выпуск сертификата

AWS_PROFILE=certbot \
sudo certbot certonly \
  --dns-route53 \
  -d example.com -d '*.example.com' \
  --non-interactive

Примечание: можно использовать переменные окружения вместо профиля (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY).


Интеграция с веб-серверами

Nginx

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

Hook для перезагрузки /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh:

#!/bin/sh
if nginx -t; then
    systemctl reload nginx
else
    echo "Nginx configuration test failed"
    exit 1
fi
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

HAProxy

Объединение сертификата и ключа:

cat /etc/letsencrypt/live/example.com/fullchain.pem \
    /etc/letsencrypt/live/example.com/privkey.pem \
    | tee /etc/haproxy/certs/example.com.pem >/dev/null

Фрагмент конфига:

frontend https-in
    bind *:443 ssl crt /etc/haproxy/certs/example.com.pem
    default_backend web-backend

Traefik

Файл /etc/traefik/dynamic.yml:

tls:
  certificates:
    - certFile: /etc/letsencrypt/live/example.com/fullchain.pem
      keyFile: /etc/letsencrypt/live/example.com/privkey.pem

traefik.yml:

providers:
  file:
    filename: /etc/traefik/dynamic.yml

Если Traefik работает в Docker:

-v /etc/letsencrypt:/etc/letsencrypt:ro

Автоматизация продления

Certbot

Cron-задание:

sudo crontab -e
0 0,12 * * * certbot renew --quiet --deploy-hook /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

Логи ошибок: /var/log/letsencrypt/letsencrypt.log.

acme.sh

При установке acme.sh сам прописывает cron. Проверка:

crontab -l | grep acme.sh

Альтернатива: acme.sh

Установка:

curl https://get.acme.sh | sh

Cloudflare:

export CF_Token="YOUR_CF_API_TOKEN"
~/.acme.sh/acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'

AWS Route 53:

export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_REGION="us-east-1"
~/.acme.sh/acme.sh --issue --dns dns_aws -d example.com -d '*.example.com'

Установка сертификата:

~/.acme.sh/acme.sh --install-cert -d example.com \
  --key-file       /etc/ssl/example.com/privkey.pem \
  --fullchain-file /etc/ssl/example.com/fullchain.pem \
  --reloadcmd     "systemctl reload nginx"

Certbot vs acme.sh

КритерийCertbotacme.sh
ЯзыкPythonPOSIX sh
УстановкаПакеты ОС или snapОдин скрипт `curlsh`
Поддержка DNSОфициальные плагины~40 провайдеров встроено
ОбновленияЧерез пакетный менеджерАвтообновление встроено
Хуки и деплойОграниченные хукиУдобные --reloadcmd, --deploy
ЗависимостиPython, пакеты certbot-*curl, socat, openssl
РесурсыТяжелее (Python)Легче, минималистичный
ПопулярностьДе-факто стандарт, больше документацииУдобнее для CI/CD

Когда выбрать Certbot:

  • если нужна официальная поддержка Let’s Encrypt,
  • если удобно ставить пакеты через apt/yum,
  • если приоритет — стандартная экосистема.

Когда выбрать acme.sh:

  • если минимальная среда без Python,
  • если выпуск нужно встроить в CI/CD pipeline,
  • если DNS-провайдер поддерживается напрямую в acme.sh.

Ограничения и риски

  • Утечка API-токена = полный контроль над DNS-зоной.
  • Лимиты Let’s Encrypt: до 50 сертификатов в неделю на домен.
  • DNS propagation: задержка от секунд до минут.
  • Ошибки продления: некорректные хуки могут привести к истечению.

Совет: добавьте мониторинг (Zabbix, Prometheus, Nagios) для контроля сроков действия сертификатов.


Вывод

DNS-валидация позволяет:

  • автоматизировать выпуск и продление SSL,
  • использовать wildcard-сертификаты,
  • не зависеть от открытых портов.

Cloudflare и AWS Route 53 дают API для полной автоматизации. Интеграция с Nginx, HAProxy и Traefik занимает всего несколько строк конфигурации. Автоматическое продление и мониторинг — обязательные шаги для надёжной эксплуатации.

Отзывы по теме

Спасибо Михаилу за отзывчивость. Созвонились, объяснил как сделать самому. Обращаюсь уже второй раз, все супер и оперативно.

kireevk

kireevk · Консультация по nginx proxy manager и portainer

Освоившийся покупатель

25.02.2025 · ⭐ 5/5

Спасибо Михаилу за отзывчивость. Созвонились, объяснил как сделать самому. Обращаюсь уже второй раз, все супер и оперативно.

Хочу выразить огромную благодарность специалисту, который настроил мне ЧПУ на OpenCart. Настроить ЧПУ оказалось легко и просто, и я рад, что наконец нашел профессионала, который сделал всё качественно и без лишних сложностей. До этого я сменил четырёх специалистов, и каждый раз возникали проблемы с настройкой, но этот человек справился с задачей идеально.

apande

apande · Настройка nginx и opencart

Очень мощный покупатель

07.09.2024 · ⭐ 5/5

Хочу выразить огромную благодарность специалисту, который настроил мне ЧПУ на OpenCart. Настроить ЧПУ оказалось легко и просто, и я рад, что наконец нашел профессионала, который сделал всё качественно и без лишних сложностей. До этого я сменил четырёх специалистов, и каждый раз возникали проблемы с настройкой, но этот человек справился с задачей идеально.

Нужно было решить проблему с SSL сертификатом на сервере, который был выпущен через Ngnix Proxy manager. Михаил уточнил все детали, как у меня все устроено, попросил доступы чтобы оценить реальность решения задачи, т. к. до этого не сталкивался с подобным сервисом. Быстро разобрался и решил мою проблему. Идеальное сотрудничество)

kireevk

kireevk · Диагностика Nginx Proxy Manager в docker контейнере и решение проблемы

Освоившийся покупатель

15.03.2024 · ⭐ 5/5

Нужно было решить проблему с SSL сертификатом на сервере, который был выпущен через Ngnix Proxy manager. Михаил уточнил все детали, как у меня все устроено, попросил доступы чтобы оценить реальность решения задачи, т. к. до этого не сталкивался с подобным сервисом. Быстро разобрался и решил мою проблему. Идеальное сотрудничество)

Нужна помощь?

Свяжись со мной и я помогу решить проблему

Похожие посты