← К вики

SSL-сертификат через Certbot

Как бесплатно получить SSL-сертификат Let's Encrypt с помощью Certbot.

Время: 10 мин · Сложность: ★☆☆☆☆

Подходит: ✓ Ubuntu 22.04 · ✓ Debian 12


Краткое описание

Certbot — официальный клиент Let's Encrypt для автоматического получения и обновления бесплатных SSL-сертификатов. Поддерживает Nginx и Apache: сам редактирует конфигурацию веб-сервера и добавляет обновление по расписанию через systemd.

Когда пригодится

  • При первом запуске сайта на VPS
  • При добавлении нового домена или поддомена
  • При переходе с платного сертификата на бесплатный Let's Encrypt

Что понадобится

  • Домен, A-запись которого указывает на IP вашего сервера
  • Порт 80 открыт в UFW или другом файрволе (Let's Encrypt проверяет домен через HTTP)
  • Установленный Nginx или Apache (для режима с плагином)

Пошаговая инструкция

1. Установка Certbot

Базовый пакет:

apt install -y certbot

Плагин для Nginx:

apt install -y python3-certbot-nginx

Плагин для Apache:

apt install -y python3-certbot-apache

2. Получить сертификат

Для Nginx (Certbot сам отредактирует конфигурацию):

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

Для Apache:

certbot --apache -d example.com

Standalone-режим (без веб-сервера, Certbot поднимает собственный HTTP-сервер):

certbot certonly --standalone -d example.com

В standalone-режиме порт 80 должен быть свободен — остановите Nginx/Apache перед запуском.

Certbot задаст несколько вопросов: email для уведомлений об истечении сертификата и согласие с условиями использования.

3. Где хранятся сертификаты

После успешного получения файлы находятся в:

/etc/letsencrypt/live/example.com/
├── cert.pem       — сертификат домена
├── chain.pem      — промежуточные сертификаты
├── fullchain.pem  — cert.pem + chain.pem (используйте в Nginx/Apache)
└── privkey.pem    — приватный ключ

В конфигурации Nginx укажите:

ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

4. Автообновление

Certbot автоматически устанавливает systemd-таймер. Проверьте:

systemctl status certbot.timer

Таймер запускает обновление дважды в день. Сертификаты обновляются только если до истечения осталось меньше 30 дней.

5. Проверить автообновление вручную

certbot renew --dry-run

Флаг --dry-run проходит весь процесс без реального обновления — используйте для проверки что всё настроено правильно.

Принудительное обновление (без dry-run):

certbot renew --force-renewal

Проверка результата

Откройте https://example.com в браузере. В адресной строке должен быть замок без предупреждений. Кликните на замок — увидите информацию о сертификате с Let's Encrypt в качестве издателя.

Или проверьте через командную строку:

curl -I https://example.com

В ответе должен быть HTTP/2 200 (или 301 если настроен редирект).

Возможные ошибки

«Unable to connect to» или «Connection refused» — порт 80 закрыт в UFW. Выполните ufw allow 80 и повторите.

«Too many certificates already issued» — Let's Encrypt ограничивает выдачу до 5 сертификатов на домен в неделю. Подождите или используйте тестовую среду: добавьте флаг --staging к команде certbot.

«DNS problem: NXDOMAIN» — домен не резолвится. Проверьте A-запись: dig example.com. Изменения DNS могут распространяться до 24 часов.

«Problem binding to port 80» — порт занят Nginx или Apache. В standalone-режиме остановите веб-сервер перед запуском certbot: systemctl stop nginx.

Certbot отредактировал конфиг Nginx и сайт перестал работать — проверьте конфигурацию: nginx -t. Откатите изменения из резервной копии (Certbot сохраняет оригинал с суффиксом .bak).

FAQ

Сколько доменов можно добавить в один сертификат? До 100 доменов через флаги -d. Let's Encrypt поддерживает SAN (Subject Alternative Names).

Работает ли Certbot с wildcard-доменами (*.example.com)? Да, но для wildcard-сертификатов нужна DNS-верификация вместо HTTP. Используйте certbot certonly --manual --preferred-challenges dns -d *.example.com.

Что произойдёт если не обновить сертификат вовремя? Браузеры покажут предупреждение «Соединение не защищено», а сайт станет недоступен для большинства пользователей. Certbot отправит предупреждение на email за 20 и 10 дней до истечения.

Можно ли использовать Certbot без доменного имени? Нет. Let's Encrypt выдаёт сертификаты только для доменных имён, не для IP-адресов.

Полезные ссылки

  • certbot --help — полный список команд и флагов
  • /etc/letsencrypt/renewal/ — конфигурация автообновления для каждого домена
  • /var/log/letsencrypt/letsencrypt.log — журнал операций Certbot

Следующие статьи

Сейчас работают только те cookie, без которых сайт не откроется. Разрешите ещё аналитические — будем видеть, где интерфейс мешает, и чинить это.