Любой сайт, работающий по HTTP, передаёт логины, пароли, cookies и данные форм в открытом виде. Любой в той же сети (например, в публичной сети Wi-Fi) может перехватить эти данные. Let’s Encrypt — это бесплатный, автоматизированный центр сертификации, который выдаёт SSL/TLS-сертификаты. Certbot — это клиент, который настраивает Nginx, получает сертификат и автоматически его обновляет. Сложность для новичка в том, что перед запуском Certbot нужно убедиться, что домен смотрит на сервер, открыты порты 80 и 443, и у Nginx уже есть конфигурация для этого домена.
💡 В этом руководстве вы настроите HTTPS для вашего сайта на Nginx с помощью Let’s Encrypt. Мы установим Certbot, получим сертификат с автоматической настройкой редиректа, HSTS и OCSP Stapling, проверим автоматическое обновление и разберём типичные ошибки.
В этой статье вы узнаете:
- Какие требования должны быть выполнены до запуска Certbot (домен, DNS, порты)
- Как установить Certbot и плагин для Nginx
- Как получить сертификат одной командой с настройкой HTTPS-редиректа
- Как проверить, что сертификат установлен и работает
- Как работает автоматическое обновление сертификатов через systemd-таймер
- Как (опционально) усилить конфигурацию SSL: DH-параметры, современные шифры, HSTS
- Как решить типичные проблемы: валидация домена, отсутствие SSL-модуля, ошибки OCSP
Для кого: владельцы сайтов на Nginx, администраторы серверов, а также все, кто хочет настроить бесплатный HTTPS на Debian 11, 12 или 13.
1. 🔧 Предварительные требования
Перед настройкой убедитесь, что выполнены следующие условия. Если что-то пропустить — Certbot выдаст ошибку.
- Установленный и работающий Nginx. Если Nginx ещё не установлен, сначала пройдите наше руководство по установке Nginx Mainline на Debian.
- Зарегистрированное доменное имя, которое указывает на ваш сервер. Должна быть настроена A-запись (или AAAA для IPv6), указывающая на публичный IP-адрес вашего сервера.
- Открытые порты 80 (HTTP) и 443 (HTTPS) в фаерволе. Let’s Encrypt использует HTTP-01 валидацию через порт 80. Если порты закрыты — сертификат не выдастся. Инструкции для UFW см. в разделе 8.1.
- Настроенный server block в Nginx для вашего домена (файл в
/etc/nginx/sites-available/с симлинком вsites-enabled). Certbot будет опираться на него. - Права sudo для выполнения команд.
⚠️ ВАЖНО: Проверьте права sudo перед установкой
Если вы не уверены, есть ли у вашего пользователя права администратора, выполните в терминале:
sudo whoami
Что делает: sudo выполняет команду от имени суперпользователя, whoami показывает имя текущего пользователя.
Зачем: Эта команда проверяет, есть ли у вас права sudo. Без них вы не сможете устанавливать пакеты.
✅ Если выводит root — всё в порядке, можете продолжать.
❌ Если выводит is not in the sudoers file — сначала пройдите наше руководство по настройке sudo.
1.1 Обновление системы
Перед установкой всегда обновляйте список пакетов:
sudo apt update && sudo apt upgrade -y
Что делает:
sudo— права суперпользователяapt update— обновляет список доступных пакетов&&— выполняет следующую команду только если предыдущая успешнаapt upgrade -y— обновляет все установленные пакеты
Зачем: Certbot и его зависимости должны устанавливаться в актуальную систему.
2. 📦 Установка Certbot и плагина для Nginx
Certbot — это официальный клиент Let’s Encrypt. Плагин python3-certbot-nginx позволяет Certbot автоматически изменять конфигурацию Nginx (добавлять SSL-директивы, настраивать редирект).
sudo apt install certbot python3-certbot-nginx -y
Что делает: Устанавливает Certbot и его Nginx-плагин из официальных репозиториев Debian.
Проверка установки:
certbot --version
✅ Ожидаемый вывод в терминале (Debian 13):
certbot 4.0.0
(На Debian 12 будет Certbot 2.1, на Debian 11 — 1.12. Все версии работают с командами из этого руководства.)
3. 🔐 Получение сертификата и настройка HTTPS
Самый простой способ — запустить Certbot с флагами, которые сразу настроят HTTPS-редирект, HSTS и OCSP Stapling.
Замените в команде:
you@example.comна ваш реальный email (туда будут приходить уведомления о продлении сертификата)yourdomain.comна ваш реальный домен
sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email you@example.com -d yourdomain.com
Что делает каждый флаг:
| Флаг | Что делает |
|---|---|
--nginx | Использует Nginx-плагин для автоматического изменения конфигурации |
--agree-tos | Соглашается с условиями использования Let’s Encrypt |
--redirect | Настраивает постоянный 301 редирект с HTTP на HTTPS |
--hsts | Добавляет заголовок Strict-Transport-Security (браузеры будут запоминать использовать только HTTPS) |
--staple-ocsp | Включает OCSP Stapling (ускоряет проверку статуса сертификата) |
--email | Email для уведомлений о продлении и проблемах |
-d | Домен (или несколько доменов) для сертификата |
Если вам нужен сертификат сразу для двух доменов (например, example.com и www.example.com):
sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email you@example.com -d yourdomain.com -d www.yourdomain.com
✅ Ожидаемый вывод в терминале (сокращённо):
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/yourdomain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/yourdomain.com/privkey.pem
This certificate expires on 2026-03-02.
These files will be updated when the certificate renews.
3.1 Интерактивный режим (если не хотите указывать все флаги)
Можно запустить Certbot без флагов, и он задаст вопросы:
sudo certbot --nginx
Вас спросят:
- Email (обязательно)
- Согласие с условиями (введите
A) - Нужно ли делиться email с EFF (обычно
N) - Для каких доменов из конфигурации Nginx выдать сертификат (введите номер или номера через запятую)
- Нужен ли редирект HTTP → HTTPS (выберите
2— редирект, это безопасно)
4. ✅ Проверка установленного сертификата
Через Certbot
sudo certbot certificates
✅ Ожидаемый вывод в терминале:
Found the following certs:
Certificate Name: yourdomain.com
Domains: yourdomain.com
Expiry Date: 2026-03-02 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/yourdomain.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/yourdomain.com/privkey.pem
Через браузер
Откройте ваш сайт по HTTPS (например, https://yourdomain.com). В адресной строке должен появиться замочек (значок безопасности). Нажмите на него — увидите информацию о сертификате.
5. 🔄 Автоматическое обновление сертификатов
Сертификаты Let’s Encrypt действуют 90 дней. Certbot настраивает автоматическое обновление через systemd-таймер.
Проверка, что таймер активен:
sudo systemctl status certbot.timer
✅ Ожидаемый вывод в терминале (сокращённо):
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled)
Active: active (waiting)
Trigger: Mon 2025-12-02 12:00:00 UTC; 1h 59min left
Что важно: Таймер запускается дважды в сутки (в районе полуночи и полудня, с рандомной задержкой). Certbot проверяет, не истекает ли сертификат в ближайшие 30 дней. Если истекает — обновляет.
Ручная проверка обновления (тестовый прогон):
sudo certbot renew --dry-run
✅ Ожидаемый вывод в конце:
Congratulations, all simulated renewals succeeded
Если вы видите эту строку — автоматическое обновление будет работать.
6. ⚙️ (Опционально) Усиление SSL-конфигурации Nginx
Certbot уже настраивает безопасную конфигурацию. Но если вы хотите более современные шифры, DH-параметры и тонкую настройку, можно дополнить конфигурацию. Эти шаги необязательны.
⚠️ Внимание: Редактируйте конфигурацию Nginx только если понимаете, что делаете. Ошибочная конфигурация может сделать сайт недоступным.
6.1 Открытие файла конфигурации вашего сайта
sudo nano /etc/nginx/sites-available/yourdomain.com
6.2 Добавление SSL-сессии и резолвера для OCSP
Внутри блока server { ... } (который слушает порт 443) добавьте или замените следующие строки:
# SSL-сессия
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
# OCSP Stapling (у Certbot уже включено, но добавим резолвер)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;
resolver 1.1.1.1 1.0.0.1 valid=300s;
resolver_timeout 5s;
Что делает:
ssl_session_cache— кеширует SSL-сессии, ускоряя повторные подключенияresolver— указывает DNS-сервер для OCSP-запросов (здесь Cloudflare DNS)
6.3 Генерация DH-параметров (для TLS 1.2)
DH-параметры усиливают обмен ключами для старых клиентов, которые используют TLS 1.2. Этот шаг не обязателен, но рекомендуется.
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Сколько длится: От 30 секунд до нескольких минут, в зависимости от сервера.
Что делает: Генерирует файл с параметрами Диффи-Хеллмана.
Добавьте в конфигурацию Nginx (в блок server { ... } для порта 443):
ssl_dhparam /etc/ssl/certs/dhparam.pem;
6.4 Современные шифры и протоколы (Mozilla Intermediate)
Certbot уже включает неплохие шифры. Если хотите явно задать современный набор (поддерживается всеми браузерами с 2018 года), добавьте:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
Зачем: ssl_prefer_server_ciphers off позволяет клиенту выбрать самый быстрый шифр (современные браузеры сами выбирают хорошие варианты).
6.5 Проверка и перезагрузка Nginx
sudo nginx -t
✅ Ожидаемый вывод: syntax is ok и test is successful
sudo systemctl reload nginx
Что делает: Перезагружает конфигурацию без разрыва активных соединений.
7. ⚠️ Решение типичных проблем
7.1 Ошибка: Challenge failed для домена (невалидация)
Симптом: Certbot выдаёт:
Challenge failed for domain yourdomain.com
Type: unauthorized
Detail: Invalid response from http://yourdomain.com/.well-known/acme-challenge/...
Причина: Let’s Encrypt не может получить доступ к временному файлу через HTTP. Чаще всего проблема в DNS или фаерволе.
Пошаговое решение:
Шаг 1: Проверьте, что DNS A-запись вашего домена указывает на ваш сервер:
getent hosts yourdomain.com
✅ Ожидаемый вывод: IP-адрес вашего сервера. Если выводится другой IP — измените DNS-запись у регистратора.
Шаг 2: Проверьте, что порт 80 открыт и Nginx его слушает:
sudo ss -tlnp | grep ':80'
✅ Ожидаемый вывод: Строка с LISTEN и nginx. Если нет — Nginx не запущен или слушает другой порт.
Шаг 3: Проверьте фаервол (UFW):
sudo ufw status | grep -E '80|Nginx'
✅ Ожидаемый вывод: Должны быть строки с 80/tcp ALLOW или Nginx Full ALLOW.
Если нет — откройте порты:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Или проще: разрешить профиль Nginx Full
sudo ufw allow 'Nginx Full'
Шаг 4: После исправлений перезапустите Certbot.
7.2 Ошибка: unknown directive «ssl_certificate» (SSL-модуль Nginx не загружен)
Симптом: После запуска Certbot nginx -t выдаёт:
nginx: [emerg] unknown directive "ssl_certificate" in /etc/nginx/sites-enabled/yourdomain.com:15
Причина: Nginx собран без поддержки SSL (такое бывает, если установлена минимальная версия).
Пошаговое решение:
Шаг 1: Проверьте, есть ли SSL-модуль:
nginx -V 2>&1 | grep -o 'with-http_ssl_module'
Что ищем: Если вывод пустой — модуля нет.
Шаг 2: Переустановите Nginx с полными модулями:
sudo apt install --reinstall nginx-full -y
Шаг 3: Проверьте снова:
nginx -V 2>&1 | grep -o 'with-http_ssl_module'
✅ Ожидаемый вывод: with-http_ssl_module
Шаг 4: Перезапустите Certbot.
7.3 Ошибка: OCSP Stapling warning (no resolver defined)
Симптом: В логах Nginx (или при проверке конфигурации) появляется предупреждение:
nginx: [warn] "ssl_stapling" ignored, no resolver defined
Причина: Certbot включает ssl_stapling on, но не добавляет директиву resolver, которая нужна для DNS-запросов при проверке статуса сертификата.
Решение: Добавьте в конфигурацию вашего сайта (внутри блока server { ... } для 443 порта):
resolver 1.1.1.1 1.0.0.1 valid=300s;
resolver_timeout 5s;
Затем перезагрузите Nginx:
sudo nginx -t && sudo systemctl reload nginx
7.4 Ошибка: слишком много сертификатов (rate limit)
Симптом: Certbot выдаёт:
Error creating new order :: too many certificates already issued for exact set of domains
Причина: Let’s Encrypt ограничивает количество сертификатов для одного домена (обычно 50 в неделю). Такое случается, если вы много раз тестировали.
Пошаговое решение:
Шаг 1: Используйте тестовое окружение (staging) для экспериментов:
sudo certbot --nginx --staging -d yourdomain.com
Сертификаты из staging не будут доверенными, но они не сжигают лимиты.
Шаг 2: Если нужно срочно — подождите неделю, лимит сбросится.
8. ❌ Удаление Certbot и сертификатов
Если вы хотите полностью удалить Certbot и Let’s Encrypt сертификаты (например, переходите на другой сервер).
8.1 Удаление сертификата (без отзыва)
sudo certbot delete --cert-name yourdomain.com
Что делает: Удаляет сертификат из системы.
8.2 Удаление пакетов Certbot
sudo systemctl disable --now certbot.timer
sudo apt remove --purge certbot python3-certbot-nginx -y
sudo apt autoremove -y
8.3 Удаление конфигурационных файлов Let’s Encrypt
⚠️ Осторожно: Удаляет все сертификаты и настройки Certbot.
sudo rm -rf /etc/letsencrypt /var/lib/letsencrypt /var/log/letsencrypt
8.4 Возврат конфигурации Nginx
Вам нужно вручную отредактировать файл вашего сайта в /etc/nginx/sites-available/:
- Удалить строки с
ssl_certificate,ssl_certificate_key,return 301 https://...и т.д. - Вернуть обычный блок
listen 80;без SSL.
Затем проверить и перезагрузить Nginx:
sudo nginx -t && sudo systemctl reload nginx
9. 📝 Чек-лист: всё готово к работе
- [ ] Домен смотрит на ваш сервер (проверка:
getent hosts yourdomain.com) - [ ] Порты 80 и 443 открыты в фаерволе
- [ ] Nginx установлен и есть server block для вашего домена
- [ ] Certbot и плагин установлены (
certbot --version) - [ ] Сертификат получен (
sudo certbot certificates) - [ ] Сайт открывается по HTTPS, в браузере зелёный замочек
- [ ] Таймер обновления активен (
sudo systemctl status certbot.timer) - [ ] Тестовый прогон обновления прошёл (
sudo certbot renew --dry-run)
Заключение
Вы настроили HTTPS для вашего сайта на Nginx с помощью Let’s Encrypt. Теперь все данные между посетителями и сервером шифруются. Certbot автоматически обновит сертификат через systemd-таймер, и вам не нужно об этом вспоминать. Главные моменты, которые нужно помнить: перед запуском Certbot домен уже должен смотреть на сервер, а порты 80 и 443 — быть открытыми. Если вы хотите усилить конфигурацию, раздел 6 показывает, как добавить DH-параметры и современные шифры.
Что дальше:
- Настройте автоматическую отправку логов и мониторинг (например, через Fail2Ban)
- Добавьте дополнительные заголовки безопасности (X-Frame-Options, X-Content-Type-Options)
- Если у вас несколько сайтов на одном сервере, получите отдельный сертификат для каждого (или один мультидоменный)
- Для корпоративных нужд изучите возможность использования DNS-валидации (для wildcard-сертификатов)