Защита Nginx с помощью Let’s Encrypt на Debian 13, 12, 11: подробное руководство

Любой сайт, работающий по 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 (ускоряет проверку
статуса сертификата)
--emailEmail для уведомлений о продлении и
проблемах
-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-сертификатов)