Certbot для Nginx и Apache: бесплатный SSL сертификат Let's Encrypt
Certbot для Nginx получает бесплатный сертификат Let's Encrypt и включает HTTPS одной командой: sudo certbot --nginx -d example.ru. Нужны только домен, указывающий на сервер, и открытый порт 80. Ниже установка на Ubuntu, Debian, Fedora и Arch, wildcard через DNS, проверка автопродления и разбор ошибок проверки домена.

Содержание
Что проверяет Let's Encrypt перед выдачей сертификата
Let's Encrypt выдаёт сертификат только тому, кто докажет контроль над доменом. Certbot делает это автоматически одним из способов:
- HTTP-01 - Certbot кладёт временный файл в
/.well-known/acme-challenge/, а серверы Let's Encrypt забирают его по порту 80. Самый простой вариант, но wildcard так не получить; - DNS-01 - в зону домена добавляется TXT-запись
_acme-challenge. Работает для wildcard и для серверов, закрытых от интернета; - TLS-ALPN-01 - проверка по порту 443, Certbot её не использует, она нужна другим клиентам.
Перед запуском убедитесь в трёх вещах: A-запись (и AAAA, если она есть) указывает на этот сервер, порт 80 открыт снаружи, веб-сервер отвечает на имя домена. Проверить DNS со своей машины: dig +short example.ru A и dig +short example.ru AAAA.
Срок жизни сертификата сейчас 90 дней. Let's Encrypt объявил сокращение: с 10 февраля 2027 года стандартный профиль перейдёт на 64 дня, а с 16 февраля 2028 года на 45 дней. Если автопродление настроено, на практике ничего не меняется. Если вы продлеваете руками раз в квартал, пора это прекратить. Письма о скором истечении Let's Encrypt больше не рассылает, так что надеяться на напоминание в почте нельзя.
Установка Certbot: snap, apt, dnf и pacman
Разработчики Certbot из EFF рекомендуют snap: так вы получаете актуальную версию (на осень 2026 года это ветка 5.x) и таймер продления сразу. Пакеты из репозиториев дистрибутивов старее, но для HTTP-проверки с Nginx или Apache их вполне хватает.
| Система | Команда установки | Таймер продления |
|---|---|---|
| Любой дистрибутив со snap | sudo snap install --classic certbot | snap.certbot.renew.timer |
| Ubuntu 26.04, Debian 13 | sudo apt install certbot python3-certbot-nginx | certbot.timer |
| Fedora 44 | sudo dnf install certbot python3-certbot-nginx | certbot-renew.timer, включить вручную |
| Arch Linux | sudo pacman -S certbot certbot-nginx | создаётся вручную |
Для Apache замените плагин на python3-certbot-apache или certbot-apache в Arch. Установка через snap по официальной инструкции:
sudo apt remove certbot # если ставили из репозитория, чтобы не было двух копий
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
certbot --version
Две копии Certbot на одной машине дают два таймера, которые продлевают одни и те же сертификаты. Оставьте одну.
Certbot и Nginx: сертификат и HTTPS одной командой
Плагин nginx ищет server-блок, у которого server_name совпадает с доменом, проходит проверку и дописывает в этот блок listen 443 ssl, пути к сертификату и редирект с HTTP. Если server-блока ещё нет, сначала создайте его по статье про установку и настройку nginx.
sudo nginx -t
sudo certbot --nginx -d example.ru -d www.example.ru
При первом запуске Certbot спросит email и согласие с условиями. Для скриптов то же самое задаётся ключами:
sudo certbot --nginx -d example.ru -d www.example.ru \
--non-interactive --agree-tos -m admin@example.ru --redirect
Файлы появятся в /etc/letsencrypt/live/example.ru/: fullchain.pem указывается в ssl_certificate, privkey.pem в ssl_certificate_key. Это ссылки на актуальную версию, при продлении путь не меняется.
Если не хотите, чтобы Certbot трогал конфиг
Вариант certonly только получает сертификат. С webroot проверка идёт через файлы в корне сайта, nginx не перезапускается и не правится:
sudo certbot certonly --webroot -w /var/www/example.ru/html -d example.ru -d www.example.ru
Строки ssl_certificate и редирект в этом случае вы добавляете сами. Проверка результата: curl -vI https://example.ru 2>&1 | grep -E 'expire|subject'.
Let's Encrypt для Apache
С Apache логика та же. Плагин находит VirtualHost с нужным ServerName, создаёт копию для порта 443 в файле *-le-ssl.conf и включает модуль ssl.
sudo apt install certbot python3-certbot-apache
sudo apachectl configtest
sudo certbot --apache -d example.ru -d www.example.ru
Если Certbot пишет, что не нашёл подходящий виртуальный хост, проверьте, что в конфиге сайта есть строка ServerName example.ru, а сам сайт включён через a2ensite. В Fedora Apache называется httpd, а плагин ставится пакетом python3-certbot-apache.
Wildcard-сертификат *.example.ru через DNS-01
Сертификат на все поддомены сразу выдаётся только после проверки через DNS. Учтите, что *.example.ru не покрывает сам example.ru, поэтому указывайте оба имени.
С плагином DNS-провайдера
Если DNS домена обслуживает провайдер с API и для него есть плагин (Cloudflare, DigitalOcean, Route 53, OVH и другие), продление будет полностью автоматическим. Пример для Cloudflare на snap-версии:
sudo snap set certbot trust-plugin-with-root=ok
sudo snap install certbot-dns-cloudflare
sudo mkdir -p /root/.secrets
echo 'dns_cloudflare_api_token = ВАШ_ТОКЕН' | sudo tee /root/.secrets/cloudflare.ini
sudo chmod 600 /root/.secrets/cloudflare.ini
sudo certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
-d example.ru -d '*.example.ru'
Токен создавайте с правом редактирования DNS только для нужной зоны, а не глобальный ключ аккаунта. На apt-системах плагин ставится пакетом python3-certbot-dns-cloudflare.
Вручную, если API нет
sudo certbot certonly --manual --preferred-challenges dns -d example.ru -d '*.example.ru'
Certbot покажет значение TXT-записи _acme-challenge.example.ru, вы добавите её в панели регистратора и нажмёте Enter, когда запись разойдётся. Проверить можно так: dig +short TXT _acme-challenge.example.ru @8.8.8.8. Минус ручного режима: сам он не продлевается, через 60 дней всё повторять. Для автоматизации понадобится скрипт для --manual-auth-hook под API вашего регистратора.
Автопродление: проверка таймера и перезагрузка сервера
Certbot продлевает сертификат, когда до окончания остаётся меньше 30 дней. Запуск идёт по таймеру systemd дважды в сутки. Убедитесь, что он есть и активен, а затем прогоните пробное продление на тестовом сервере Let's Encrypt:
systemctl list-timers | grep -i certbot
sudo certbot renew --dry-run
В Fedora таймер нужно включить: sudo systemctl enable --now certbot-renew.timer. Как читать список таймеров и логи служб, разобрано в статье про systemctl, а классический вариант через планировщик описан в материале о cron.
Плагины nginx и apache сами перезагружают сервер после продления. В режимах webroot, standalone и DNS сервер не узнает о новом сертификате, пока вы его не перезагрузите. Добавьте хук один раз, он сохранится в настройках продления:
sudo certbot reconfigure --cert-name example.ru --deploy-hook "systemctl reload nginx"
# либо общий скрипт для всех сертификатов
sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh <<'EOF'
#!/bin/sh
systemctl reload nginx
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
Параметры каждого сертификата хранятся в /etc/letsencrypt/renewal/example.ru.conf. Править их руками можно, но надёжнее через certbot reconfigure.
Ошибки проверки домена и как их читать
Certbot пишет подробный лог в /var/log/letsencrypt/letsencrypt.log. Основные сообщения:
- Timeout during connect (likely firewall problem) - порт 80 закрыт: файрвол на сервере, группа безопасности у хостера или проброс на роутере. Для UFW:
sudo ufw allow 80,443/tcp, подробнее в статье про UFW; - Invalid response from http://example.ru/.well-known/acme-challenge/...: 404 - запрос пришёл не в тот server-блок. Проверьте server_name, сервер по умолчанию и редиректы, которые уводят запрос на другой хост;
- DNS problem: NXDOMAIN looking up A - записи нет или она ещё не разошлась. Смотрите
digчерез публичный резолвер; - проверка проходит по IPv6 и падает - у домена осталась старая AAAA-запись, указывающая на другой сервер. Удалите её или настройте сайт на IPv6;
- too many certificates already issued - сработал лимит. Сейчас это 5 одинаковых сертификатов на один набор имён за 7 дней, 50 сертификатов на зарегистрированный домен за 7 дней и 5 неудачных проверок одного имени в час.
Пока отлаживаете, работайте с тестовым сервером: ключ --test-cert выдаёт недоверенный сертификат без влияния на боевые лимиты. Когда всё прошло, запустите команду без ключа.
Сервер за Cloudflare с включённым проксированием (оранжевое облако) часто ломает HTTP-проверку из-за принудительного редиректа на HTTPS. Самый спокойный вариант в такой схеме - DNS-01 с токеном Cloudflare: проверка не зависит от того, что происходит на портах 80 и 443.
Список сертификатов, новые домены, удаление и отзыв
# что выдано и когда истекает
sudo certbot certificates
# добавить поддомен в существующий сертификат
sudo certbot --nginx --cert-name example.ru -d example.ru -d www.example.ru -d shop.example.ru
# удалить сертификат, который больше не нужен
sudo certbot delete --cert-name old.example.ru
# отозвать, если утёк приватный ключ
sudo certbot revoke --cert-name example.ru
Перед delete уберите ссылки на этот сертификат из конфигов веб-сервера, иначе nginx не стартует после следующей перезагрузки. Каталог /etc/letsencrypt целиком стоит включить в резервную копию: в нём ключи, учётная запись ACME и настройки продления. Полный список ключей Certbot есть в официальной документации.
Частые вопросы
Сколько действует сертификат Let's Encrypt?
Сейчас 90 дней. С февраля 2027 года стандартный срок сократится до 64 дней, с февраля 2028 года до 45 дней. При работающем автопродлении ничего делать не нужно.
Можно ли получить сертификат без открытого порта 80?
Да, через DNS-проверку: certbot certonly --manual --preferred-challenges dns или плагин DNS-провайдера. Так же получают wildcard и сертификаты для внутренних серверов.
Как проверить, что автопродление работает?
Выполните systemctl list-timers | grep certbot и sudo certbot renew --dry-run. Если пробное продление прошло без ошибок, настоящее тоже пройдёт.
Покрывает ли *.example.ru сам домен example.ru?
Нет. Wildcard действует только на поддомены первого уровня, поэтому в команде указывают оба имени: -d example.ru -d '*.example.ru'.
Что делать с ошибкой too many certificates already issued?
Подождать: лимит считается за скользящие 7 дней. Пока отлаживаете настройку, используйте ключ --test-cert, тестовый сервер не расходует боевые лимиты.
Документация и источники
- Certbot Instructions, EFF, 2026
- User Guide, Certbot documentation, 2026
- Decreasing Certificate Lifetimes to 45 Days, Let's Encrypt, 2025
- Rate Limits, Let's Encrypt, 2026
Читайте также
- Установка и настройка nginx на Ubuntu и Debian: от первого сайта до reverse proxy
- Настройка UFW: включаем firewall в Ubuntu и открываем нужные порты
- systemctl в Linux: управление службами и автозагрузкой
- Cron и crontab в Linux: как настроить задания по расписанию
- DNS в Linux: как сменить сервер, включить DNS over TLS и очистить кэш
Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.