Обычный HTTP-challenge для Let's Encrypt не поддерживает Wildcard-сертификаты (*.example.com). Для Wildcard нужен DNS-01 challenge — подтверждение через TXT-запись в DNS.
Как работает DNS-01 challenge
- Certbot запрашивает сертификат у Let's Encrypt
- Let's Encrypt даёт случайный токен
- Certbot просит добавить TXT-запись:
_acme-challenge.example.com - Let's Encrypt проверяет TXT-запись через DNS
- Сертификат выдаётся
Вручную через certbot
# Запрос Wildcard сертификата
certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d "example.com"
# Certbot покажет TXT-запись для добавления:
# _acme-challenge.example.com. 300 IN TXT "TOKEN"
# Добавьте запись в DNS, затем нажмите Enter
# Сертификат будет в /etc/letsencrypt/live/example.com/
Автоматически через acme.sh + Cloudflare API
# Установка acme.sh
curl https://get.acme.sh | sh
# Настройка Cloudflare API
export CF_Token="YOUR_CLOUDFLARE_API_TOKEN"
export CF_Account_ID="YOUR_ACCOUNT_ID"
# Выпуск Wildcard сертификата
~/.acme.sh/acme.sh --issue --dns dns_cf -d "*.example.com" -d "example.com" --keylength ec-256
# Установка в Nginx
~/.acme.sh/acme.sh --install-cert -d "*.example.com" --key-file /etc/nginx/ssl/example.key --fullchain-file /etc/nginx/ssl/example.crt --reloadcmd "systemctl reload nginx"
Поддерживаемые DNS-провайдеры в acme.sh
acme.sh поддерживает автоматическое обновление через API более 100 DNS-провайдеров: Cloudflare, Route 53, DigitalOcean, Namecheap, Google Cloud DNS и другие.
💡 Wildcard + cron: Настройте автообновление через cron — acme.sh делает это автоматически при установке. Сертификаты Let's Encrypt действуют 90 дней, нужно обновление каждые 60 дней.
⚠️ Ручной DNS-challenge: При ручной процедуре сертификат нельзя обновить автоматически — придётся повторять процесс каждые 90 дней. Используйте API-интеграцию для автоматизации.