Single-domain сертификат от Let's Encrypt получается за секунды HTTP-01 challenge. С wildcard (*.example.com) сложнее: только DNS-01, и нужен доступ к API DNS-провайдера. Разберём практику для основных провайдеров.
Wildcard-сертификат полезен, если у вас много поддоменов, создаваемых динамически (мульти-тенантный SaaS, dev-стенды).
Почему wildcard требует DNS-01
HTTP-01 challenge требует, чтобы Let's Encrypt мог достучаться до http://example.com/.well-known/acme-challenge/<token>. Для конкретного домена — легко. Но для *.example.com невозможно: сотни поддоменов, часто их даже не существует физически.
DNS-01 решает: certbot добавляет TXT-запись _acme-challenge.example.com с уникальным токеном. Let's Encrypt проверяет TXT через DNS. Это работает для любого домена, включая wildcard.
Cloudflare DNS + certbot
Самый популярный сценарий:
# Создайте API token в Cloudflare:
# https://dash.cloudflare.com/profile/api-tokens
# Permissions: Zone.Zone Read, Zone.DNS Edit
# Zone Resources: Include - Specific zone - example.com
apt install certbot python3-certbot-dns-cloudflare -y
cat > /root/.cloudflare.ini <<EOF
dns_cloudflare_api_token = <YOUR_TOKEN>
EOF
chmod 600 /root/.cloudflare.ini
# Первый запрос — wildcard + apex
certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /root/.cloudflare.ini \
--dns-cloudflare-propagation-seconds 30 \
-d 'example.com' -d '*.example.com' \
-m [email protected] --agree-tos --non-interactive
# Сертификат в /etc/letsencrypt/live/example.com/
ls -la /etc/letsencrypt/live/example.com/Автообновление
Certbot ставит cron-задачу автоматически. Проверьте:
systemctl list-timers | grep certbot
# должен быть certbot.timer, ~2 раза в день
# Ручной тест обновления (dry-run)
certbot renew --dry-run
# Nginx перечитывает сертификат через post-hook:
# /etc/letsencrypt/renewal-hooks/post/nginx-reload.sh
#!/bin/bash
systemctl reload nginxЕсли у вас несколько сервисов (nginx + postfix + dovecot) — сделайте post-hook, перезагружающий каждый. Иначе postfix будет отдавать старый сертификат 90 дней.
AWS Route53
Плагин для AWS DNS-01:
apt install python3-certbot-dns-route53 -y
# Настройте IAM user с политикой:
# route53:ChangeResourceRecordSets на нужную HostedZone
# route53:GetChange на *
# route53:ListHostedZones на *
# Credentials в ~/.aws/credentials
aws configure
certbot certonly \
--dns-route53 \
-d 'example.com' -d '*.example.com' \
-m [email protected] --agree-tos --non-interactiveУниверсальный вариант: acme.sh
acme.sh — bash-скрипт, поддерживает 150+ DNS-провайдеров, работает без Python-зависимостей. Часто удобнее certbot.
curl https://get.acme.sh | sh -s [email protected]
source ~/.bashrc
# Пример: Cloudflare (тот же token)
export CF_Token="<your-cloudflare-token>"
export CF_Account_ID="<your-account-id>"
acme.sh --issue --dns dns_cf \
-d 'example.com' -d '*.example.com' \
--keylength ec-256
# Установка в nginx:
acme.sh --install-cert -d 'example.com' \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.pem \
--reloadcmd "systemctl reload nginx"DNS-провайдер не поддерживается напрямую?
Если у вас DNS-провайдер без прямого плагина (некоторые российские), два обходных пути:
- Manual mode — certbot покажет TXT-запись, вы вручную добавите в панели,
Enter. Работает, но не автоматизируется. - Alias mode / CNAME-делегирование — переносите
_acme-challenge.example.comчерез CNAME на другой домен, для которого API есть. Автообновление работает. - Смените DNS-провайдера — Cloudflare Free полностью бесплатен, поддержка везде.
6-дневные сертификаты
В 2026-м Let's Encrypt разворачивает опциональный 6-дневный profile для клиентов, готовых часто обновлять. Плюс — компрометация ключа даёт злоумышленнику максимум 6 дней. Минус — жёсткие требования к автоматизации (24/7 работающий обновляющий процесс).
Для большинства проектов остаётся 90-дневный формат — золотая середина.