Как получить бесплатный SSL-сертификат через Certbot и Nginx на Ubuntu 24

Certbot и Nginx — обычный способ поставить на сервер с Ubuntu бесплатный SSL-сертификат Let’s Encrypt: Certbot получает сертификат, сам дописывает строки HTTPS в настройки сайта и вовремя его продлевает. Инструкция следует указаниям certbot.eff.org для Ubuntu 24.04 и 22.04. В конце — ошибки, на которые натыкаются чаще всего, и что каждая из них значит.

Что нужно до начала

  • Домен, у которого запись A (и AAAA, если она есть) указывает на этот сервер. Let’s Encrypt проверяет домен из интернета.
  • Nginx с сайтом, в server_name которого стоит этот домен. Если сайта ещё нет, см. как установить Nginx на Ubuntu.
  • Открытые порты 80 и 443. Чтобы убедиться, что домен ваш, Let’s Encrypt подключается к порту 80.

Если UFW включён (в его состоянии стоит Status: active), разрешите Nginx на обоих портах:

sudo ufw allow 'Nginx Full' sudo ufw status

На облачном сервере откройте порты 80 и 443 ещё и в брандмауэре или группе безопасности провайдера. UFW им не управляет.

Как установить Certbot через snap

certbot.eff.org советует пакет snap: в нём всегда текущая версия, и сертификаты он продлевает сам. Snap в Ubuntu есть из коробки. Первая команда удаляет старый Certbot из apt, если он был. Ваши сертификаты в /etc/letsencrypt/ остаются на месте.

sudo apt remove certbot sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/local/bin/certbot certbot --version

Ссылка кладёт команду certbot на привычный путь. Если apt пишет Package 'certbot' is not installed, so not removed, удалять было нечего.

Как запустить Certbot для Nginx

Каждый домен, который должен войти в сертификат, указывайте через отдельный -d. При первом запуске Certbot спросит адрес почты и попросит принять условия Let’s Encrypt.

sudo certbot --nginx -d example.com -d www.example.com

Certbot находит блок server с таким server_name, добавляет строки сертификата и переадресацию с HTTP на HTTPS и перечитывает настройки Nginx. В конце он сообщает Successfully received certificate и Successfully deployed certificate. Откройте https://example.com: в браузере будет замок.

Если настройки Nginx хотите править сами, запустите вместо этого такую команду. Тогда Certbot только получит сертификат, а ваши файлы не тронет:

sudo certbot certonly --nginx

Как проверить, что сертификат продлевается

Сертификат Let’s Encrypt действует 90 дней, и в ближайшие годы Let’s Encrypt собирается сократить срок до 45 дней. Пакет snap ставит таймер systemd, который дважды в день запускает certbot и продлевает сертификаты, у которых срок подходит к концу. Один раз проверьте продление вхолостую и посмотрите на таймер:

sudo certbot renew --dry-run systemctl list-timers | grep certbot

Проверка должна закончиться строкой Congratulations, all simulated renewals succeeded. Она обращается к тестовому серверу Let’s Encrypt и ничего не меняет.

С июня 2025 года Let’s Encrypt больше не присылает писем перед окончанием срока. Время от времени смотрите дату окончания у каждого сертификата: sudo certbot certificates

Где Certbot хранит файлы

  • /etc/letsencrypt/live/example.com/ — текущий сертификат. Nginx берёт отсюда fullchain.pem и privkey.pem.
  • /etc/letsencrypt/renewal/example.com.conf — как продлевается этот сертификат.
  • /var/log/letsencrypt/letsencrypt.log — подробный журнал каждого запуска.
  • Все сертификаты, их домены и сроки: sudo certbot certificates

Файл privkey.pem держите в тайне: с ним кто угодно может выдать себя за ваш сайт. Не копируйте его на другие серверы и в репозиторий Git.

Частые ошибки Certbot

  • Could not automatically find a matching server block for example.com. Set the server_name directive to use the Nginx installer. — сертификат выпущен, но сайта с таким именем нет. Добавьте в свой сайт server_name example.com; и проверьте настройки: sudo nginx -t Перечитайте настройки Nginx, а затем поставьте сохранённый сертификат: sudo certbot install --cert-name example.com
  • Timeout during connect (likely firewall problem) — Let’s Encrypt не достучался до порта 80. Проверьте UFW, брандмауэр облачного провайдера и что Nginx запущен.
  • DNS problem: NXDOMAIN looking up A for example.com — у домена ещё нет записи A или новая запись не разошлась. Проверьте её у своего DNS-провайдера и попробуйте позже. Мешает и старая запись AAAA, которая указывает на другой сервер.
  • too many certificates вместе с already issued for this exact set of identifiers — Let’s Encrypt выдаёт не больше 5 сертификатов на один и тот же набор имён за 7 дней. Подождите, а изменения проверяйте с --dry-run, такие запуски не считаются.
  • При любой другой ошибке смотрите конец /var/log/letsencrypt/letsencrypt.log.

Если вы работаете и на Mac

MacWashing, раздел «Сборка мусора»: найдены мусор Xcode, пользовательский кэш, установщики и журналы, к очистке 22,83 ГБ

Сборка мусора в MacWashing находит кэш всех знакомых ей программ, в том числе спрятанный внутри их данных, а ещё журналы, мусор Xcode и остатки удалённых программ. Она показывает, сколько места занимает каждая находка, и очищает всё за один раз. Всё спорное остаётся без галочки, пока вы не решите.

Бесплатная пробная версия · macOS 14 и новее

Вопросы и ответы

Как пользоваться Certbot с Nginx?

Поставьте Certbot: sudo snap install --classic certbot Затем выполните: sudo certbot --nginx -d example.com Он получит сертификат, поправит сайт в Nginx и настроит продление.

Сертификат Let’s Encrypt правда бесплатный?

Да. Let’s Encrypt — некоммерческий удостоверяющий центр и денег за сертификаты не берёт. Браузеры доверяют им так же, как платным.

Нужно ли продлевать сертификат вручную?

Нет. Таймер Certbot продлевает его до окончания срока и перечитывает настройки Nginx. Один раз выполните эту команду, чтобы убедиться, что продление работает: sudo certbot renew --dry-run