Nginx HTTPS в 2026 году: TLS 1.3, Let's Encrypt и безопасная конфигурация — пошаговое руководство | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Nginx HTTPS в 2026 году: TLS 1.3, Let's Encrypt и безопасная конфигурация — пошаговое руководство

06 апреля 2026 9 мин. чтения

Настройка безопасного HTTPS на Nginx перестала быть опцией — это обязательный стандарт для любого публичного сервиса в 2026 году. Данное руководство предоставляет актуальную, проверенную на практике инструкцию по внедрению TLS 1.3, автоматизации работы с сертификатами Let's Encrypt и конфигурации Nginx, соответствующей современным требованиям безопасности. Вы получите готовые команды, конфигурационные блоки и скрипты для автоматизации, которые минимизируют риски и экономят время на внедрение и поддержку.

Зачем HTTPS в 2026 году: TLS 1.3 и новые требования безопасности

Эволюция протоколов шифрования привела к тому, что TLS 1.2, долгое время бывший золотым стандартом, уступает место TLS 1.3. Ключевое улучшение — сокращение «рукопожатия» (handshake) до одного цикла обмена данными (1-RTT), что напрямую влияет на скорость установления безопасного соединения и снижает задержки. С точки зрения безопасности, TLS 1.3 удалил поддержку устаревших и уязвимых алгоритмов шифрования, таких как RC4, SHA-1 и CBC-режимы, оставив лишь небольшую группу стойких и эффективных cipher suites.

Требования браузеров и стандартов ужесточились. Крупные браузеры маркируют сайты без HTTPS как «небезопасные», а для доменов, предварительно занесённых в HSTS-прелоад списки (например, .dev, .app), соединение по HTTP блокируется изначально. Риски использования старых протоколов (SSLv3, TLS 1.0, TLS 1.1) и слабых наборов шифров — это не только потенциальная утечка данных, но и негативное влияние на SEO-ранжирование и доверие пользователей.

В основе доверия лежит цепочка сертификатов. Let's Encrypt, являясь бесплатным и автоматизированным центром сертификации (CA), стал де-факто стандартом для большинства проектов. Его роль в 2026 году — обеспечить простой и надёжный механизм построения этой цепочки доверия, доступный как для стартапов, так и для корпоративных сред, через стандартизированный протокол ACME.

Выбор и установка ACME-клиента для автоматизации с Let's Encrypt

Для взаимодействия с Let's Encrypt по протоколу ACME необходим клиент. В 2026 году два основных варианта сохраняют актуальность: Certbot (от EFF) как наиболее универсальный и интегрированный инструмент и acme.sh как легковесная и гибкая альтернатива для специфичных окружений.

Для большинства сценариев с Nginx на стандартных Linux-дистрибутивах рекомендуется Certbot. Его установка выполняется через менеджеры пакетов:

Для Ubuntu/Debian:

sudo apt update
sudo apt install certbot python3-certbot-nginx

Для CentOS/RHEL/Rocky Linux/AlmaLinux:

sudo dnf install epel-release
sudo dnf install certbot python3-certbot-nginx

После установки проверьте работоспособность клиента командой certbot --version.

Certbot: установка и базовые команды для работы с Nginx

Плагин python3-certbot-nginx позволяет Certbot автоматически читать и модифицировать конфигурации Nginx. Ключевые флаги для понимания:

  • --nginx: Использует плагин для Nginx, который автоматически настроит виртуальный хост.
  • --webroot (-w): Указывает путь к корневой директории сайта для верификации через HTTP-запрос. Используется, когда Nginx уже обслуживает сайт.
  • --standalone: Запускает временный веб-сервер для верификации. Используется, когда Nginx не запущен или не слушает порт 80/443.

Для первого теста можно получить пробный (staging) сертификат, который не засоряет лимиты Let's Encrypt:

sudo certbot certonly --nginx --staging -d ваш-домен.ru

Альтернативы Certbot для специфичных сценариев (TrueNAS, Docker)

В средах, где установка стандартных пакетов затруднена или нежелательна (например, внутри минималистичных Docker-контейнеров), отлично подходит acme.sh. Это bash-скрипт, который работает практически в любой POSIX-совместимой среде.

Установка acme.sh:

curl https://get.acme.sh | sh -s email=ваш@email.ru

Для TrueNAS Scale (на базе Linux) acme.sh можно запустить в оболочке, а полученные сертификаты скопировать в системную директорию /etc/certificates для последующего импорта через веб-интерфейс. На TrueNAS Core (FreeBSD) процесс аналогичен, но требует установки через pkg или ports.

Получение и автоматическое обновление сертификатов Let's Encrypt

Основная ценность Let's Encrypt — не в бесплатности, а в возможности полной автоматизации жизненного цикла сертификата, что критически важно для эксплуатации.

Первичная генерация сертификата: пошаговый пример для одного домена

Для получения рабочего сертификата с автоматической интеграцией в Nginx выполните команду (предварительно убедившись, что домен указывает на IP-адрес вашего сервера):

sudo certbot --nginx -d ваш-домен.ru

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

  • Конфигурация вашего сайта в /etc/nginx/sites-available/ будет автоматически обновлена: добавлены директивы ssl_certificate и ssl_certificate_key.
  • Файлы действующего сертификата и приватного ключа будут размещены в /etc/letsencrypt/live/ваш-домен.ru/. Это символические ссылки на актуальные файлы в архиве Let's Encrypt.

Обязательно проверьте работу Nginx после изменений: sudo nginx -t && sudo systemctl reload nginx.

Настройка автоматического обновления: cron, systemd и проверка

Сертификаты Let's Encrypt действительны 90 дней. Certbot включает встроенную команду renew, которая проверяет все выданные сертификаты и обновляет те, срок действия которых истекает в течение 30 дней.

Способ 1: Cron (классический)
Добавьте задачу в crontab (sudo crontab -e):

0 12 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

Задача будет запускаться ежедневно в 12:00, но реальное обновление произойдёт только когда сертификату останется менее 30 дней. Флаг --post-hook гарантирует перезагрузку конфигурации Nginx только в случае успешного обновления.

Способ 2: Systemd Timer (более современный)
Создайте службу и таймер. Файл службы /etc/systemd/system/certbot-renew.service:

[Unit]
Description=Certbot Renewal

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

Файл таймера /etc/systemd/system/certbot-renew.timer:

[Unit]
Description=Timer for Certbot Renewal

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

Активируйте таймер: sudo systemctl enable --now certbot-renew.timer.

Проверка обновления: Перед внедрением автоматизации протестируйте процесс командой sudo certbot renew --dry-run. Она имитирует обновление, не внося реальных изменений.

Для работы с wildcard-сертификатами (*.ваш-домен.ru) потребуется использовать метод DNS-верификации (флаг --dns-*), что выходит за рамки базового руководства, но принцип автоматизации через renew остаётся тем же.

Безопасная конфигурация Nginx для TLS 1.3 и современных стандартов

Получение сертификата — только половина дела. Безопасность соединения определяется параметрами, которые вы задаёте в конфигурации Nginx. Ниже приведён оптимизированный конфигурационный блок, который можно разместить в отдельном файле (например, /etc/nginx/conf.d/ssl-params.conf) и включить в нужные виртуальные хосты с помощью include.

# Протоколы SSL/TLS. Отключаем всё устаревшее, оставляем только TLS 1.2 и 1.3.
ssl_protocols TLSv1.2 TLSv1.3;

# Приоритетные наборы шифров для TLS 1.3 (встроены в OpenSSL, явно задавать не нужно).
# Наборы шифров для TLS 1.2. Современный, безопасный список.
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;

# Сервер сам выбирает cipher suite, а не клиент.
ssl_prefer_server_ciphers off; # В современных конфигурациях рекомендуется 'off' для лучшей совместимости с TLS 1.3.

# Кэширование сессий для ускорения повторных подключений.
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off; # Отключаем tickets из соображений безопасности, если не используется распределённое кэширование сессий.

# Безопасные кривые для алгоритма Диффи-Хеллмана.
ssl_ecdh_curve X25519:secp521r1:secp384r1:prime256v1; # X25519 имеет приоритет как самый быстрый и безопасный.

# Заголовок HSTS (HTTP Strict Transport Security) — предписывает браузеру использовать только HTTPS.
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

# Заголовки, защищающие от некоторых видов атак (MIME-sniffing, clickjacking).
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

# Заголовок Content-Security-Policy (CSP) требует индивидуальной настройки под каждый сайт.
# Пример базовой политики для статичного сайта или базы знаний, запрещающей выполнение встроенного JS и загрузку ресурсов со сторонних доменов:
# add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'" always;

Этот конфиг можно применить в блоке server для порта 443, добавив строку include /etc/nginx/conf.d/ssl-params.conf; после директив ssl_certificate.

Оптимальные параметры шифрования: cipher suites и протоколы

Конфигурация выше уже содержит оптимальные настройки. Ключевые моменты:

  • ssl_protocols TLSv1.2 TLSv1.3: TLS 1.3 включён по умолчанию в современных сборках Nginx с OpenSSL 1.1.1+. TLS 1.2 оставлен для обратной совместимости со старыми, но ещё актуальными клиентами.
  • ssl_ciphers: Список включает только стойкие алгоритмы на основе ECDHE (Elliptic Curve Diffie-Hellman Ephemeral), что обеспечивает совершенную прямую секретность (PFS). Алгоритмы на основе RSA для обмена ключами исключены.
  • ssl_ecdh_curve X25519: Кривая Curve25519 является современным стандартом для алгоритма Эль-Гамаля на эллиптических кривых, предлагая высокую скорость и безопасность.

Дополнительные заголовки безопасности (HSTS, CSP) и их настройка

Заголовок Strict-Transport-Security (HSTS) критически важен. Параметр max-age=63072000 (2 года) указывает браузеру запомнить домен как HTTPS-only. includeSubDomains распространяет правило на все поддомены. preload — это директива для включения домена в жестко встроенный в браузеры список HSTS, но перед её использованием необходимо зарегистрировать домен на hstspreload.org.

Content-Security-Policy (CSP) — мощный механизм для предотвращения XSS-атак. Пример в конфиге выше строгий и подойдёт не для всех приложений. Для динамических сайтов (например, на CMS или с фронтенд-фреймворками) политику необходимо тщательно тестировать, так как она может блокировать легитимные скрипты и стили. Начните с режима наблюдения, используя заголовок Content-Security-Policy-Report-Only.

Для комплексной настройки безопасности Nginx, включая защиту от DDoS и ограничение запросов, обратитесь к нашему полному руководству по SSL/TLS и HTTPS в Nginx.

Проверка и тестирование конфигурации

Перед применением конфигурации в production обязательно протестируйте её. Используйте команду sudo nginx -t для проверки синтаксиса. Для тестирования самого SSL-соединения локально подойдёт openssl s_client:

openssl s_client -connect localhost:443 -servername ваш-домен.ru -tls1_3

В выводе ищите строку Protocol : TLSv1.3 и используемый cipher suite.

Анализ через SSL Labs: как читать отчет и исправлять проблемы

Самый авторитетный онлайн-инструмент — SSL Labs Server Test. После сканирования вашего домена обратите внимание на:

  1. Общую оценку: Стремитесь к A+. Оценка A или A+ в 2026 году является минимально приемлемой для production-сервисов.
  2. Protocol Support: Убедитесь, что TLS 1.3 отмечен как поддерживаемый, а SSLv3, TLS 1.0, TLS 1.1 — как неподдерживаемые.
  3. Key Exchange: В идеале должен использоваться алгоритм на основе эллиптических кривых (например, X25519).
  4. Cipher Strength: Должно быть не менее 128 бит (для симметричного шифрования).
  5. Заголовки HSTS, CSP: Будут отображены в соответствующем разделе отчёта.

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

  • «Weak cipher suites are supported»: Пересмотрите директиву ssl_ciphers, удалите из списка шифры, помеченные как слабые (например, содержащие CBC, 3DES, RC4 или без GCM/POLY1305).
  • «HSTS not implemented»: Добавьте заголовок Strict-Transport-Security в конфигурацию Nginx.
  • «Certificate not trusted»: Убедитесь, что в конфигурации Nginx указан полный цепочный сертификат (обычно fullchain.pem от Let's Encrypt).

Решение частых проблем и нюансы для специфичных инфраструктур

Ошибки при автоматическом обновлении: Частая причина — недоступность домена на момент верификации (порт 80/443 заблокирован файрволом, DNS-проблемы). Проверяйте логи Certbot (sudo journalctl -u certbot или /var/log/letsencrypt/letsencrypt.log). Убедитесь, что задача cron/systemd работает от root.

Внутренние (B2B) домены: Let's Encrypt не выпускает сертификаты для доменов без публичной DNS-записи (например, server.local). Для таких случаев используйте самоподписанные сертификаты или разверните внутренний центр сертификации (например, на базе Vault).

Reverse Proxy и несколько приложений: При использовании Nginx в качестве обратного прокси для нескольких бэкендов (например, Docker-контейнеров), SSL Termination происходит на самом Nginx. Убедитесь, что в конфигурации upstream-блоков передаются необходимые заголовки, такие как X-Forwarded-Proto, чтобы бэкенд понимал, что исходное соединение было защищённым. Подробные примеры таких конфигураций вы найдёте в нашем руководстве по настройке Nginx Reverse Proxy.

Резервное копирование и откат: Перед любыми изменениями в конфигах Nginx создавайте их копии. Простая процедура: sudo cp /etc/nginx/sites-available/ваш-сайт /etc/nginx/sites-available/ваш-сайт.backup_$(date +%Y%m%d). В случае критической ошибки после изменений вы всегда сможете быстро откатиться к рабочей версии.

Поделиться:
Сохранить гайд? В закладки браузера