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 --webroot | HTTP-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.
Проверка результата
- Откройте сайт по
https://в браузере — адресная строка должна показывать закрытый замок без предупреждений. - Проверьте редирект с HTTP на HTTPS:
curl -I http://yourdomain.comдолжен вернуть301или308на https-адрес. - Проверьте таймер автопродления:
systemctl is-enabled certbot.timerдолжен вернутьenabled. - Через внешний сервис проверки TLS убедитесь, что отдаётся полная цепочка сертификатов, а не только сам сертификат домена — часть браузеров подставит промежуточный сертификат сама, но не все.
Если после установки сертификата нужно донастроить сам HTTPS-блок Nginx — протоколы, шифры, HSTS, — это отдельная тема в статье про настройку Nginx для сайта на VDS.