Обычный Let's Encrypt сертификат выдаётся на конкретный домен. Wildcard-сертификат (*.yourdomain.com) покрывает любое количество субдоменов — удобно для многосайтовых проектов.
Установка Certbot
sudo apt update && sudo apt install -y certbot python3-certbot-dns-cloudflare
Certbot + Cloudflare DNS (рекомендуется)
# Создать API токен Cloudflare:
# Dashboard → Profile → API Tokens → Create Token
# Permissions: Zone.DNS → Edit
# Сохранить токен
sudo mkdir -p /etc/letsencrypt
sudo nano /etc/letsencrypt/cloudflare.ini
dns_cloudflare_api_token = ВАШ_CLOUDFLARE_TOKEN
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
# Получить wildcard сертификат
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d "yourdomain.com" -d "*.yourdomain.com" --agree-tos --non-interactive
Без Cloudflare: ручной DNS challenge
sudo certbot certonly --manual --preferred-challenges dns -d "*.yourdomain.com" -d "yourdomain.com"
# Certbot выдаст TXT-запись для DNS:
# Добавьте: _acme-challenge.yourdomain.com TXT "xxx..."
# Подождите 60 сек и нажмите Enter
Подключение к Nginx
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
Автопродление
sudo certbot renew --dry-run
# Добавить в cron:
0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
Разбор типичных ошибок
Ошибка DNS problem: NXDOMAIN looking up TXT record при ручном DNS challenge означает, что TXT-запись _acme-challenge ещё не видна публичным DNS-серверам — либо она добавлена с опечаткой, либо не прошло достаточно времени на распространение.
Domain: yourdomain.com
Type: dns
Detail: DNS problem: NXDOMAIN looking up TXT record for _acme-challenge.yourdomain.com
Проверьте запись независимо от certbot, прежде чем нажимать Enter: dig TXT _acme-challenge.yourdomain.com +short с другого сервера или через публичный резолвер вроде 8.8.8.8. Если запись не видна снаружи спустя несколько минут — проблема в самой DNS-панели, а не в тайминге.
Ошибка Error creating new order :: too many failed authorizations у Let's Encrypt появляется после нескольких неудачных попыток подряд для одного домена и блокирует новые попытки на час. Для отладки DNS-валидации без траты дневного лимита используйте флаг --staging, который выдаёт тестовые сертификаты без ограничений боевого окружения.
Сравнение DNS-плагинов Certbot
| Плагин | Автоматизация | Когда использовать |
|---|---|---|
| dns-cloudflare | Полная, через API-токен | DNS уже на Cloudflare |
| dns-route53 | Полная, через IAM-права | DNS в AWS Route 53 |
| --manual | Нет, ручная вставка TXT-записи | Любой DNS-провайдер без готового плагина |
Без API-плагина автопродление wildcard-сертификата не сработает: certbot не может сам вставить новую TXT-запись при --manual, поэтому каждые 90 дней придётся повторять процесс руками, если DNS-провайдер не поддерживается напрямую.
Когда wildcard-сертификат не нужен
- У вас один-два поддомена, а не десятки — проще и надёжнее выпустить обычный сертификат на конкретные имена через Certbot с HTTP-валидацией, без возни с DNS API.
- DNS управляется через панель без API или через сторонний регистратор без поддержки в certbot — тогда каждое продление требует ручного вмешательства, и обычный сертификат с автопродлением через HTTP надёжнее.
- Поддомены выпускаются динамически под каждого клиента (SaaS с произвольными именами) — DNS-01 для wildcard не подходит для доменов третьего уровня, создаваемых на лету; для этого случая нужна отдельная автоматизация выпуска сертификатов через ACME API при регистрации клиента.
Проверка результата
- Проверьте, что сертификат реально wildcard:
openssl x509 -in /etc/letsencrypt/live/yourdomain.com/cert.pem -noout -text | grep DNSдолжен показать иyourdomain.com, и*.yourdomain.com. - Откройте любой случайный поддомен в браузере, который раньше не существовал в конфиге Nginx явно, — замок должен быть закрытым без предупреждений.
- Проверьте автопродление сухим прогоном:
certbot renew --dry-runдолжен завершиться без ошибок DNS-плагина. - Если используете
--manual, отметьте в календаре дату следующего продления за неделю до истечения — автоматика здесь не сработает сама.
Обычный (не wildcard) выпуск и автопродление сертификата через Nginx-плагин разобраны в статье про Certbot и Nginx. Если сайт стоит за Cloudflare, сначала посмотрите статью про режимы SSL/TLS в Cloudflare — она влияет на выбор способа валидации.
Метод 1: Ручной DNS challenge
sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d "example.com"
# Certbot попросит добавить TXT-запись:
# _acme-challenge.example.com → указанное значение
#
# Добавьте запись в DNS и дождитесь propagation (1–5 мин)
# Затем нажмите Enter
Метод 2: Автоматический через Cloudflare API
# Создать файл с токеном Cloudflare
sudo nano /etc/letsencrypt/cloudflare.ini
# Содержимое:
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
# Получить сертификат
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d "*.example.com" -d "example.com" --email admin@example.com --agree-tos --non-interactive
Настройка Nginx с wildcard SSL
server {
listen 443 ssl http2;
server_name *.example.com example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
Проверка и обновление
# Проверить сертификат
sudo certbot certificates
# Тест автообновления
sudo certbot renew --dry-run
# Принудительное обновление
sudo certbot renew --force-renewal
Частые вопросы
Можно ли получить wildcard-сертификат через обычную HTTP-валидацию, без обращения к DNS?
Нет, протокол ACME требует именно DNS-валидацию для wildcard-сертификатов — HTTP-01 challenge подтверждает владение конкретным именем через файл на веб-сервере, а для произвольного поддомена такой файл физически невозможно разместить заранее. Поэтому Certbot при выпуске wildcard-сертификата всегда запрашивает TXT-запись в DNS, независимо от того, автоматизирован процесс через API или выполняется вручную.
Покрывает ли сертификат *.domain.com сам голый домен domain.com без поддомена?
Нет, запись wildcard покрывает только поддомены первого уровня и не включает сам голый домен автоматически — её нужно указывать отдельным именем при выпуске сертификата, как показано в примерах команд certbot с двумя флагами -d. Если забыть добавить голый домен отдельно, браузер будет показывать предупреждение именно при заходе без поддомена.
Что произойдёт, если сертификат истечёт, а автопродление не было настроено?
Браузеры посетителей начнут показывать предупреждение о недействительном сертификате на всех поддоменах сразу, а не только на одном сайте — ведь один wildcard-сертификат обслуживает их все одновременно. Избежать этого помогает именно настройка автопродления через DNS API, а при ручном способе дата следующего продления должна быть отмечена заранее и не оставлена на последний момент.
Можно ли использовать один и тот же wildcard-сертификат сразу на нескольких серверах?
Да, один и тот же файл сертификата и приватного ключа можно скопировать и использовать на нескольких серверах одновременно — ограничений по числу машин для одного сертификата нет. Важно только синхронизировать продление: если сертификат обновляется на одном сервере, обновлённые файлы нужно распространить на остальные, иначе часть серверов продолжит отдавать устаревший сертификат.