К основному содержимому

Установка SSL на Nginx с помощью Certbot

VDS / VPS · 22.02.2025 · 4 мин чтения
Иллюстрация к статье «Установка SSL на Nginx с помощью Certbot»

Certbot — официальный клиент Let's Encrypt, который получает бесплатный TLS-сертификат и сам правит конфигурацию Nginx под HTTPS. На VDS это стандартный способ закрыть сайт замком в адресной строке без покупки сертификата.

Certbot — бесплатный SSL для Nginx

Let's Encrypt выпускает сертификаты сроком на 90 дней и подтверждает владение доменом одним из способов валидации: по HTTP (файл на сайте) или по DNS (TXT-запись). Плагин python3-certbot-nginx использует HTTP-валидацию и сам добавляет блоки listen 443 ssl в конфиг.

Установка Certbot

На Ubuntu 20.04+ и Debian 11+ пакет уже в стандартном репозитории, отдельный PPA не нужен:

apt update
apt install certbot python3-certbot-nginx -y

# Проверить версию
certbot --version

Получение сертификата

Плагин nginx сам находит нужный server_name в конфигурации и добавляет туда SSL-блок:

certbot --nginx -d yourdomain.com -d www.yourdomain.com

Если Nginx ещё не настроен или сертификат нужен отдельно от правки конфига — например, для проверки перед боевым переключением, — используется режим certonly с корнем сайта:

certbot certonly --webroot -w /var/www/yourdomain.com -d yourdomain.com -d www.yourdomain.com

В этом случае сертификат ложится в /etc/letsencrypt/live/yourdomain.com/, а пути к fullchain.pem и privkey.pem нужно прописать в server-блоке вручную.

Автопродление

Certbot ставит systemd-таймер, который дважды в день проверяет срок действия и продлевает сертификаты, которым осталось меньше 30 дней:

systemctl status certbot.timer
systemctl list-timers | grep certbot

Продление не требует повторного ввода домена и не трогает остальную часть конфигурации Nginx — обновляются только файлы в /etc/letsencrypt/live/, сам Nginx перечитывает их после reload, который certbot выполняет автоматически через deploy-hook.

Принудительная проверка продления

# Тестовый прогон без реального продления
certbot renew --dry-run

# Журнал прошлых попыток
cat /var/log/letsencrypt/letsencrypt.log

Сравнение способов получения SSL

СпособВалидацияWildcard-доменыСтоимость и срок
Certbot + nginx-плагинHTTP-01, автоматическиНетБесплатно, 90 дней, автопродление
Certbot + DNS-плагинDNS-01, через API DNS-провайдераДаБесплатно, 90 дней, автопродление
Certbot certonly --webrootHTTP-01, без правки NginxНетБесплатно, 90 дней
Платный сертификат (OV/EV)Проверка организации вручнуюОбычно даПлатно, 1–2 года

Для wildcard-сертификата на *.yourdomain.com нужна DNS-валидация, потому что подтвердить владение сразу всеми возможными поддоменами через HTTP невозможно — подробный процесс описан в статье о wildcard-сертификатах через Certbot.

Разбор типичных ошибок

Ошибка Could not bind TCP port 80 because it is already in use появляется, когда certbot в режиме standalone пытается сам поднять временный веб-сервер на 80-м порту, а Nginx уже его занимает. Решение — использовать плагин --nginx или --webroot вместо standalone, они работают через уже запущенный сервер, а не вместо него.

Failed authorization procedure. yourdomain.com (http-01): urn:ietf:params:acme:error:connection ::
Fetching http://yourdomain.com/.well-known/acme-challenge/xxx: Connection refused

Эта ошибка почти всегда означает, что порт 80 закрыт файрволом или DNS-запись домена ещё не указывает на текущий сервер. Проверьте ufw status и результат dig yourdomain.com +short перед повторной попыткой.

Лимит too many certificates already issued — у Let's Encrypt действует ограничение: не более 5 одинаковых сертификатов на один точный набор доменов за 7 дней и 50 сертификатов на зарегистрированный домен за неделю. Он ловится тестами через staging-окружение — добавьте --staging к команде, чтобы отладить процесс, не тратя лимит боевых сертификатов.

Ручная проверка сертификата

После выпуска стоит проверить сертификат независимо от Certbot, глазами клиента:

# Срок действия и издатель
openssl x509 -in /etc/letsencrypt/live/yourdomain.com/cert.pem -noout -dates -issuer

# Полная цепочка так, как её видит браузер
curl -vI https://yourdomain.com 2>&1 | grep -i "SSL certificate"

Когда Certbot не подходит

  • Домен без публичной DNS-записи (внутренний хост, тестовый стенд за VPN) — HTTP-01 валидация не пройдёт, нужен самоподписанный сертификат или внутренний CA.
  • Сайт полностью проксируется через Cloudflare в режиме Full (strict) — тогда сертификат нужен либо от Cloudflare Origin CA, либо тот же Let's Encrypt, но с DNS-01 через API Cloudflare, а не HTTP-01 напрямую.
  • Несколько серверов за балансировщиком нагрузки требуют синхронизации сертификата между узлами — Certbot сам этим не занимается, нужен общий storage или отдельный узел-издатель.
  • Юридическим лицам иногда нужен сертификат с проверкой организации (OV/EV) для соответствия требованиям партнёров — Let's Encrypt такие не выпускает в принципе, только DV.

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

  1. Откройте сайт по https:// в браузере — адресная строка должна показывать закрытый замок без предупреждений.
  2. Проверьте редирект с HTTP на HTTPS: curl -I http://yourdomain.com должен вернуть 301 или 308 на https-адрес.
  3. Проверьте таймер автопродления: systemctl is-enabled certbot.timer должен вернуть enabled.
  4. Через внешний сервис проверки TLS убедитесь, что отдаётся полная цепочка сертификатов, а не только сам сертификат домена — часть браузеров подставит промежуточный сертификат сама, но не все.

Если после установки сертификата нужно донастроить сам HTTPS-блок Nginx — протоколы, шифры, HSTS, — это отдельная тема в статье про настройку Nginx для сайта на VDS.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке