- Home »

Получение сертификата Let’s Encrypt через DNS-валидацию с ACME DNS Certbot на Ubuntu 24
Сертификат SSL/TLS для вашего сайта — это уже не роскошь, а необходимость. Сегодня разберём, как получить и автоматически обновлять бесплатные сертификаты Let’s Encrypt через DNS-валидацию с помощью ACME DNS Certbot на Ubuntu 24. Этот способ особенно удобен для тех, кто работает с wildcard-сертификатами или имеет доступ к серверу без внешнего HTTP-доступа. DNS-валидация позволяет получить сертификат, не открывая порты 80/443, что критично для внутренних серверов и микросервисной архитектуры.
Если вы устали от ручного перевыпуска сертификатов каждые три месяца или хотите автоматизировать процесс для множества поддоменов, эта статья поможет настроить полностью автоматическую систему. Мы пройдём весь путь от установки до настройки автообновления, разберём подводные камни и поделимся проверенными практиками.
Как работает DNS-валидация Let’s Encrypt
В отличие от HTTP-валидации, где Let’s Encrypt проверяет доступность файла по HTTP на вашем домене, DNS-валидация работает через создание специальной TXT-записи в DNS-зоне. Процесс выглядит так:
- Certbot запрашивает сертификат у Let’s Encrypt
- Let’s Encrypt генерирует уникальный токен для домена
- Certbot создаёт TXT-запись вида
_acme-challenge.yourdomain.com
с этим токеном - Let’s Encrypt проверяет наличие записи через DNS-запрос
- После успешной проверки выдаётся сертификат
Основные преимущества DNS-валидации:
- Поддержка wildcard-сертификатов (*.yourdomain.com)
- Работа без необходимости открывать HTTP-порты
- Возможность получения сертификатов для внутренних серверов
- Автоматизация через API DNS-провайдеров
Установка и настройка Certbot на Ubuntu 24
Начнём с установки Certbot и необходимых плагинов. Ubuntu 24 поставляется с актуальной версией Certbot в репозиториях:
sudo apt update
sudo apt install certbot python3-certbot-dns-cloudflare python3-certbot-dns-digitalocean python3-certbot-dns-route53
Если ваш DNS-провайдер не поддерживается встроенными плагинами, устанавливаем через pip:
sudo apt install python3-pip
pip3 install certbot-dns-[provider-name]
Для примера рассмотрим настройку с Cloudflare — одним из самых популярных DNS-провайдеров.
Настройка Cloudflare для DNS-валидации
Создаём файл с API-ключом Cloudflare:
sudo mkdir -p /etc/letsencrypt/dns-cloudflare
sudo nano /etc/letsencrypt/dns-cloudflare/cloudflare.ini
Содержимое файла:
dns_cloudflare_email = your-email@example.com
dns_cloudflare_api_key = your-global-api-key
Для повышенной безопасности рекомендуется использовать API Token вместо Global API Key:
dns_cloudflare_api_token = your-api-token
Устанавливаем правильные права доступа:
sudo chmod 600 /etc/letsencrypt/dns-cloudflare/cloudflare.ini
sudo chown root:root /etc/letsencrypt/dns-cloudflare/cloudflare.ini
Получение первого сертификата
Теперь можем получить сертификат для домена:
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/dns-cloudflare/cloudflare.ini \
--dns-cloudflare-propagation-seconds 20 \
-d example.com \
-d www.example.com
Для wildcard-сертификата:
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/dns-cloudflare/cloudflare.ini \
--dns-cloudflare-propagation-seconds 20 \
-d example.com \
-d *.example.com
Важные параметры:
--dns-cloudflare-propagation-seconds
— время ожидания распространения DNS-записи--dry-run
— тестовый режим без реального получения сертификата--force-renewal
— принудительное обновление сертификата
Настройка автообновления
Certbot автоматически создаёт задачу в cron для обновления сертификатов. Проверим её:
sudo systemctl status certbot.timer
sudo systemctl enable certbot.timer
Для более гибкой настройки создаём собственный скрипт обновления:
sudo nano /usr/local/bin/certbot-renewal.sh
Содержимое скрипта:
#!/bin/bash
# Логирование
exec > >(tee -a /var/log/certbot-renewal.log)
exec 2>&1
echo "$(date): Starting certificate renewal process"
# Обновление сертификатов
/usr/bin/certbot renew \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/dns-cloudflare/cloudflare.ini \
--dns-cloudflare-propagation-seconds 20 \
--post-hook "systemctl reload nginx"
echo "$(date): Certificate renewal process completed"
Делаем скрипт исполняемым:
sudo chmod +x /usr/local/bin/certbot-renewal.sh
Добавляем в crontab для выполнения дважды в день:
sudo crontab -e
# Добавляем строку:
0 2,14 * * * /usr/local/bin/certbot-renewal.sh
Интеграция с веб-серверами
Для Nginx создаём конфигурацию SSL:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Настройки SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
location / {
root /var/www/html;
index index.html;
}
}
Для Apache2:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
DocumentRoot /var/www/html
</VirtualHost>
Сравнение DNS-провайдеров для автоматизации
Провайдер | Плагин Certbot | API Rate Limits | Время распространения | Удобство |
---|---|---|---|---|
Cloudflare | certbot-dns-cloudflare | 1200/5min | 10-20 сек | Отлично |
DigitalOcean | certbot-dns-digitalocean | 5000/час | 30-60 сек | Хорошо |
AWS Route53 | certbot-dns-route53 | 400/5min | 60-120 сек | Хорошо |
Google Cloud DNS | certbot-dns-google | 100/100сек | 30-60 сек | Среднее |
Практические кейсы и подводные камни
Кейс 1: Множественные поддомены
При работе с микросервисами часто нужны сертификаты для множества поддоменов. Вместо создания отдельных сертификатов используем Subject Alternative Names (SAN):
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/dns-cloudflare/cloudflare.ini \
-d api.example.com \
-d admin.example.com \
-d monitoring.example.com \
-d logs.example.com
Кейс 2: Проблемы с DNS-распространением
Если получаете ошибки валидации, увеличьте время ожидания:
--dns-cloudflare-propagation-seconds 60
Для диагностики проверьте DNS-запись вручную:
dig TXT _acme-challenge.example.com
nslookup -type=TXT _acme-challenge.example.com
Кейс 3: Корпоративная сеть с прокси
В корпоративных сетях с прокси настраиваем переменные окружения:
export HTTP_PROXY=http://proxy.company.com:8080
export HTTPS_PROXY=http://proxy.company.com:8080
sudo -E certbot certonly ...
Мониторинг и уведомления
Создаём скрипт для мониторинга срока действия сертификатов:
#!/bin/bash
CERT_PATH="/etc/letsencrypt/live/example.com/cert.pem"
DAYS_BEFORE_EXPIRY=30
EMAIL="admin@example.com"
# Проверка срока действия
EXPIRY_DATE=$(openssl x509 -in "$CERT_PATH" -text -noout | grep "Not After" | cut -d: -f2-)
EXPIRY_TIMESTAMP=$(date -d "$EXPIRY_DATE" +%s)
CURRENT_TIMESTAMP=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_TIMESTAMP - $CURRENT_TIMESTAMP) / 86400 ))
if [ $DAYS_LEFT -le $DAYS_BEFORE_EXPIRY ]; then
echo "Certificate expires in $DAYS_LEFT days!" | mail -s "Certificate Warning" $EMAIL
fi
Интеграция с Prometheus для мониторинга:
# Экспортер метрик сертификатов
sudo apt install prometheus-node-exporter-collectors
Альтернативные решения
Кроме Certbot существуют другие ACME-клиенты:
- acme.sh — легковесный клиент на bash с поддержкой 50+ DNS-провайдеров
- Caddy — веб-сервер с автоматическим получением сертификатов
- Traefik — обратный прокси с интеграцией Let’s Encrypt
- cert-manager — для Kubernetes-кластеров
Пример использования acme.sh:
curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --issue --dns dns_cf -d example.com -d *.example.com
Интеграция с Docker и контейнерами
Для Docker-окружений создаём docker-compose с автоматическим обновлением:
version: '3.8'
services:
certbot:
image: certbot/dns-cloudflare:latest
volumes:
- ./letsencrypt:/etc/letsencrypt
- ./cloudflare.ini:/etc/letsencrypt/dns-cloudflare/cloudflare.ini:ro
command: >
certonly --dns-cloudflare
--dns-cloudflare-credentials /etc/letsencrypt/dns-cloudflare/cloudflare.ini
--email admin@example.com
--agree-tos
--no-eff-email
-d example.com
-d *.example.com
nginx:
image: nginx:alpine
volumes:
- ./letsencrypt:/etc/letsencrypt:ro
- ./nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "443:443"
depends_on:
- certbot
Автоматизация через API и webhooks
Для продвинутой автоматизации создаём webhook для обновления сертификатов:
#!/usr/bin/env python3
import subprocess
import sys
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/renew-certificate', methods=['POST'])
def renew_certificate():
try:
# Проверка токена безопасности
token = request.headers.get('Authorization')
if token != 'Bearer your-secret-token':
return jsonify({'error': 'Unauthorized'}), 401
# Обновление сертификата
result = subprocess.run([
'certbot', 'renew',
'--dns-cloudflare',
'--dns-cloudflare-credentials', '/etc/letsencrypt/dns-cloudflare/cloudflare.ini',
'--post-hook', 'systemctl reload nginx'
], capture_output=True, text=True)
if result.returncode == 0:
return jsonify({'status': 'success', 'output': result.stdout})
else:
return jsonify({'status': 'error', 'error': result.stderr}), 500
except Exception as e:
return jsonify({'status': 'error', 'error': str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Безопасность и лучшие практики
Для обеспечения безопасности следуйте этим рекомендациям:
- Используйте API-токены с минимальными правами вместо Global API Key
- Регулярно ротируйте API-ключи
- Храните конфиденциальные файлы с правами 600 и владельцем root
- Настройте мониторинг логов на подозрительную активность
- Используйте отдельные сертификаты для критически важных доменов
Если вам нужен надёжный сервер для развёртывания системы автоматического обновления сертификатов, рассмотрите VPS или выделенный сервер с полным root-доступом.
Заключение и рекомендации
DNS-валидация с Let’s Encrypt — это мощный инструмент для автоматизации управления SSL-сертификатами. Особенно эффективен для:
- Внутренних сервисов без внешнего HTTP-доступа
- Wildcard-сертификатов для множества поддоменов
- Микросервисной архитектуры
- CI/CD пайплайнов с автоматическим развёртыванием
Начните с простой настройки для одного домена, затем постепенно расширяйте функциональность. Обязательно настройте мониторинг и уведомления — это сэкономит много времени в будущем. Помните, что автоматизация — это не только удобство, но и повышение надёжности инфраструктуры.
Тестируйте изменения в staging-окружении перед применением в production, и всегда имейте план восстановления на случай проблем с сертификатами. Удачной автоматизации!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.