LinuxRuLinux без лишней теории
HTTPS для сайта

Certbot для Nginx и Apache: бесплатный SSL сертификат Let's Encrypt

Редакция LinuxRu7 мин чтенияИнструкции

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

Certbot для Nginx и Apache: бесплатный SSL сертификат Let's Encrypt
Фото: mikemacmarketing, CC BY 2.0, Wikimedia Commons
Содержание
  1. Как проходит проверка
  2. Установка
  3. Nginx
  4. Apache
  5. Wildcard
  6. Автопродление
  7. Ошибки проверки
  8. Управление
  9. Частые вопросы

Что проверяет 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 их вполне хватает.

СистемаКоманда установкиТаймер продления
Любой дистрибутив со snapsudo snap install --classic certbotsnap.certbot.renew.timer
Ubuntu 26.04, Debian 13sudo apt install certbot python3-certbot-nginxcertbot.timer
Fedora 44sudo dnf install certbot python3-certbot-nginxcertbot-renew.timer, включить вручную
Arch Linuxsudo 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, тестовый сервер не расходует боевые лимиты.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.