Блог
DevOps · практикаDevOps 6 мин чтения

Let's Encrypt wildcard: получить *.example.com за 5 минут

Wildcard-сертификат Let's Encrypt требует DNS-01 challenge. Разбираем пример для Cloudflare, Route53, TransIP, и как автообновлять без пляски.

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-дневный формат — золотая середина.

Частые вопросы

Wildcard от Let's Encrypt — правда бесплатно?
Да, полностью. Ограничений на wildcard нет.
Могу использовать один wildcard на нескольких серверах?
Да, скопируйте `.pem` + `.key` куда нужно. Учитывайте: компрометация одного сервера = потеря приватного ключа = компрометация wildcard.
Wildcard покрывает `sub.sub.example.com`?
Нет, только один уровень. Для двухуровневых нужно `*.*.example.com` или отдельный `*.sub.example.com`.
Обновляется ли auto через systemd?
Да, certbot ставит systemd timer. `systemctl list-timers` покажет certbot.timer.