...

Как защитить Nginx с помощью Let’s Encrypt на Ubuntu

Let's Encrypt — это центр сертификации (CA), который выдаёт бесплатные TLS/SSL-сертификаты и тем самым открывает возможность подключить HTTPS на любом веб-сервере. Весь процесс автоматизирован с помощью клиента Certbot: он сам получает сертификат, прописывает нужные директивы в конфигурацию Nginx и берёт на себя плановые обновления.

В этом руководстве мы разберём полный цикл: установку Certbot, получение сертификата для домена на Ubuntu, настройку автоматического продления и усиление конфигурации HTTPS согласно современным стандартам безопасности.

Что нужно подготовить заранее

Перед началом убедитесь, что у вас есть:

  • Сервер Ubuntu 22.04, 24.04 или 25.04 с пользователем, имеющим права sudo, и настроенным файрволом
  • Зарегистрированное доменное имя (в примерах используется example.com)
  • DNS-запись типа A для example.com, указывающая на публичный IP-адрес сервера
  • DNS-запись типа A для www.example.com, также указывающая на этот IP
  • Установленный и настроенный Nginx с серверным блоком для вашего домена

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

Разработчики Certbot рекомендуют устанавливать его через snap — так вы всегда получаете актуальную версию без ручных обновлений. Сначала обновите snap:

sudo snap install core; sudo snap refresh core

Если на сервере ранее стояла старая версия Certbot из репозиториев APT, удалите её во избежание конфликтов:

sudo apt remove certbot

Установите Certbot:

sudo snap install --classic certbot

Создайте символическую ссылку, чтобы команда была доступна глобально:

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Альтернатива (APT): если snap недоступен в вашей среде, можно установить Certbot из репозиториев Ubuntu:
sudo apt update && sudo apt install -y certbot python3-certbot-nginx
Snap всё же предпочтительнее — обновления выходят быстрее, и плагин для Nginx уже включён.

Шаг 2. Проверка конфигурации Nginx

Certbot ищет нужный серверный блок по директиве server_name. Прежде чем запрашивать сертификат, убедитесь, что она задана корректно.

Откройте файл конфигурации вашего домена:

sudo nano /etc/nginx/sites-available/example.com

Найдите строку с server_name. Она должна выглядеть так:

server_name example.com www.example.com;

Если всё верно, закройте редактор и переходите дальше. Если нет — исправьте, сохраните файл и проверьте синтаксис:

sudo nginx -t

При отсутствии ошибок перезагрузите Nginx:

sudo systemctl reload nginx

Шаг 3. Открытие порта 443 в файрволе

Если вы используете ufw, проверьте текущие правила:

sudo ufw status

Скорее всего, разрешён только HTTP. Добавьте профиль для HTTPS и уберите лишнее правило:

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

После этого статус должен содержать строку Nginx Full ALLOW Anywhere. Проверьте:

sudo ufw status

Шаг 4. Получение SSL-сертификата

Запустите Certbot с плагином для Nginx и укажите нужные домены:

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

Certbot запросит адрес электронной почты и согласие с условиями использования. После успешного выполнения вы увидите примерно такой вывод:

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2026-09-01.

Сертификат установлен, Nginx перенастроен автоматически — весь трафик по HTTP теперь перенаправляется на HTTPS. Откройте сайт в браузере и убедитесь, что в адресной строке появился замок. Для дополнительной проверки воспользуйтесь SSL Labs Server Test — при правильной конфигурации сервер получит оценку A или A+.

Шаг 5. Проверка автоматического обновления

Сертификаты Let's Encrypt действуют 90 дней. Certbot (при установке через snap) создаёт системный таймер, который дважды в сутки проверяет срок действия и обновляет сертификаты за 30 дней до истечения.

Проверьте статус таймера:

sudo systemctl status snap.certbot.renew.timer

Проведите тестовое обновление без реального запроса к серверам Let's Encrypt:

sudo certbot renew --dry-run

Если ошибок нет — всё настроено правильно. При желании можно добавить хук для перезагрузки Nginx только после успешного обновления сертификата:

sudo certbot renew --dry-run --post-hook "systemctl reload nginx"

⚠️ При установке через APT обновлением управляет задание cron, а не systemd-таймер. Убедитесь, что нужный механизм активен в вашей среде.

Усиление конфигурации HTTPS

Базовая установка сертификата — это только начало. Чтобы по-настоящему защитить соединение, стоит сделать ещё несколько шагов.

HSTS — заголовок, который браузер запоминает и после этого открывает ваш сайт только по HTTPS, не делая запрос на HTTP:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

Современные протоколы и шифры — отключите устаревшие TLS 1.0/1.1 и оставьте только надёжные наборы:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';

Редирект с HTTP на HTTPS — Certbot обычно добавляет его автоматически, но при ручной настройке выглядит так:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

Дополнительные меры для ещё более высокой оценки и производительности:

  • Включите OCSP-stapling: ssl_stapling on; ssl_stapling_verify on; — ускоряет проверку сертификата браузером
  • Настройте кеш TLS-сессий: ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; — повторные подключения будут быстрее
  • Включите HTTP/2: добавьте http2 к директиве listen 443 ssl
  • Включите сжатие Brotli или Gzip для HTML, CSS и JS

⚠️ С HSTS и особенно с флагом preload нужно быть осторожным: браузер будет открывать сайт только по HTTPS даже при проблемах с сертификатом. Включайте его только после того, как убедитесь в стабильной работе HTTPS на всех поддоменах. Для проверки конфигурации используйте Mozilla SSL Configuration Generator и SSL Labs Server Test.

Типичные проблемы и способы их решения

ACME HTTP-01 challenge не проходит. Порт 80 должен быть открыт и доступен из интернета. Проверьте правила файрвола и настройки вышестоящего балансировщика нагрузки, если он есть.

Ошибка DNS. Убедитесь, что записи A для example.com и www.example.com указывают на правильный публичный IP. DNS-изменения могут распространяться до 48 часов.

Certbot не находит серверный блок. Проверьте, что server_name в конфигурации Nginx точно совпадает с доменами, которые вы передаёте через флаг -d.

Превышены лимиты запросов Let's Encrypt. Используйте --dry-run при тестировании — это не считается реальным запросом. При повторных ошибках подождите несколько часов.

Конфликт snap и APT. Перед установкой snap-версии удалите APT-пакет certbot, иначе возможны конфликты путей.

Ответы на частые вопросы

Нужен ли домен для получения сертификата? Да. Let's Encrypt выдаёт сертификаты только для доменов с публичными DNS-записями — IP-адреса и локальные имена не поддерживаются. Для wildcard-сертификатов (*.example.com) потребуется DNS-01 валидация.

Можно ли один сертификат выдать сразу на несколько доменов? Да. Укажите все нужные домены через флаг -d:

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

Certbot получит один SAN-сертификат на все три имени и автоматически настроит Nginx. При продлении все домены обновляются вместе.

Как проверить, что автоматическое обновление работает? Запустите sudo certbot renew --dry-run и проверьте статус таймера командой sudo systemctl status snap.certbot.renew.timer. Срок действия текущего сертификата можно посмотреть так:

openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -enddate

Как убедиться, что HTTPS работает правильно? Несколько быстрых проверок из командной строки:

curl -I http://example.com      # Ожидаем 301 на https
curl -I https://example.com     # Ожидаем 200 и заголовок HSTS

Также откройте DevTools в браузере → вкладка Security, чтобы увидеть предупреждения о смешанном контенте, если он есть.

Заключение

Мы прошли весь путь: установили Certbot, получили бесплатный SSL-сертификат от Let's Encrypt, настроили Nginx для работы по HTTPS и разобрались с автоматическим продлением. Дополнительно усилили конфигурацию с помощью HSTS, современных шифров и OCSP-stapling.

Если вы управляете несколькими доменами или серверами, следующий шаг — автоматизация через Ansible или аналогичные инструменты, а также мониторинг сроков действия сертификатов с алертами. Но для большинства задач описанной конфигурации будет вполне достаточно.

Серверное решение, готовое к работе

Хотите развернуть безопасный сервер с HTTPS без лишних усилий? Мы предлагаем надёжные VPS и выделенные серверы, круглосуточную техническую поддержку и прозрачные тарифы.

Оставьте заявку — и начните работу уже сегодня!

Для реализации основных услуг и функций нашего сайта, а также для сбора данных о том, как посетители взаимодействуют с нашими сайтом, продуктами и услугами, мы применяем различные инструменты, включая файлы cookie. Нажимая «Принимаю», вы соглашаетесь с текущими правилами и условиями использования сайта и даете разрешение на использование этих данных. В противном случае, пожалуйста, покиньте сайт.

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Seraphinite AcceleratorOptimized by Seraphinite Accelerator
Turns on site high speed to be attractive for people and search engines.