В современном мире, где кибербезопасность становится всё более критичной, безопасное соединение с веб-сайтами через HTTPS уже не роскошь, а необходимость. SSL/TLS-сертификаты и правильная настройка шифрования на веб-сервере не только защищают данные ваших пользователей, но и повышают доверие к вашему сайту.
Nginx, как один из наиболее популярных веб-серверов, обладает широкими возможностями для настройки безопасных соединений. В этой статье мы рассмотрим пошаговый процесс настройки современного и надёжного SSL/TLS в Nginx, начиная от получения сертификата и заканчивая передовыми настройками, которые обеспечат максимальный уровень безопасности.
Хороший SSL/TLS — это не просто зелёный замочек в браузере. Это оптимальный баланс между безопасностью, производительностью и совместимостью с различными клиентами.
1. Основы SSL/TLS и HTTPS
Прежде чем начать настройку, давайте кратко рассмотрим основные понятия и принципы работы SSL/TLS протоколов, чтобы лучше понимать, что именно мы настраиваем.
Что такое SSL/TLS?
SSL (Secure Sockets Layer) и его преемник TLS (Transport Layer Security) — это криптографические протоколы, обеспечивающие безопасную передачу данных между клиентом и сервером. Они решают три основные задачи:
- Конфиденциальность — шифрование данных, чтобы их не могли прочитать посторонние
- Целостность — защита от изменения данных при передаче
- Аутентификация — подтверждение подлинности сервера (а иногда и клиента)
Терминология
Хотя термин "SSL" всё ещё широко используется, современные версии протокола на самом деле являются TLS. Последняя версия SSL (3.0) была признана небезопасной в 2014 году, и сегодня рекомендуется использовать TLS 1.2 или TLS 1.3.
Как работает SSL/TLS?
Процесс установления защищённого соединения состоит из нескольких этапов:
- Рукопожатие (Handshake) — клиент и сервер согласуют версию протокола и методы шифрования
- Обмен ключами — установление секретного ключа для шифрования данных
- Проверка сертификата — клиент проверяет подлинность сертификата сервера
- Шифрованная передача данных — защищённый обмен информацией
# Структура TLS-рукопожатия: 1. Client Hello: Клиент отправляет серверу информацию о поддерживаемых версиях TLS и шифрах 2. Server Hello: Сервер выбирает версию TLS и шифр, отправляет свой сертификат 3. Обмен ключами: Создание общего секретного ключа для шифрования сессии 4. Завершение: Проверка подлинности и установление защищённого соединения
Зачем нужен HTTPS?
HTTPS (HTTP Secure) — это просто HTTP-протокол, работающий поверх SSL/TLS. Использование HTTPS обеспечивает:
- Защиту конфиденциальных данных пользователей (пароли, персональная информация, платёжные данные)
- Подтверждение подлинности вашего сайта
- Улучшение позиций в поисковой выдаче (Google считает HTTPS фактором ранжирования)
- Доступ к современным функциям браузеров (некоторые API, такие как геолокация, доступны только через HTTPS)
- Повышение доверия пользователей к вашему сайту
2. Типы SSL-сертификатов
Перед тем как приступить к настройке SSL в Nginx, важно понимать, какие типы сертификатов существуют и какой подходит для ваших задач.
По уровню проверки
SSL-сертификаты различаются по уровню проверки, которую проводит центр сертификации (CA):
- DV (Domain Validation) — проверяется только владение доменом. Самый быстрый и недорогой вариант, подходит для большинства сайтов
- OV (Organization Validation) — проверяется организация, владеющая доменом. Обеспечивает более высокий уровень доверия
- EV (Extended Validation) — расширенная проверка организации. Наивысший уровень доверия, часто используется банками и платёжными системами
По количеству доменов
В зависимости от количества доменов, которые нужно защитить:
- Одиночный сертификат — для одного домена (example.com)
- Wildcard-сертификат — для домена и всех его поддоменов (*.example.com)
- Мультидоменный сертификат (SAN) — для нескольких разных доменов
Сравнение типов сертификатов
Коммерческие vs бесплатные сертификаты
В зависимости от вашего бюджета и требований:
- Коммерческие сертификаты (Comodo, DigiCert, Thawte) — предлагают дополнительные гарантии, страховку и расширенную поддержку
- Бесплатные сертификаты (Let's Encrypt, ZeroSSL) — обеспечивают базовую защиту без дополнительных расходов, но требуют регулярного обновления
Совет
Для большинства личных сайтов, блогов и небольших бизнес-проектов, DV-сертификат от Let's Encrypt будет оптимальным решением. Он бесплатный, легко устанавливается, автоматически обновляется и обеспечивает такой же уровень шифрования, как и платные аналоги.
3. Получение бесплатного SSL-сертификата Let's Encrypt
Let's Encrypt — это некоммерческий центр сертификации, предоставляющий бесплатные SSL-сертификаты. Эти сертификаты доверяют большинство современных браузеров, и они так же надёжны с точки зрения шифрования, как и коммерческие аналоги.
Установка Certbot
Certbot — это клиент для автоматизации получения и обновления сертификатов Let's Encrypt.
# Установка Certbot в Ubuntu/Debian apt update apt install certbot python3-certbot-nginx # Установка Certbot в CentOS/RHEL 8 dnf install epel-release dnf install certbot python3-certbot-nginx # Установка Certbot в CentOS 7 yum install epel-release yum install certbot python-certbot-nginx
Получение сертификата с помощью Certbot
Certbot может автоматически настроить Nginx для использования HTTPS:
# Получение и установка сертификата с автоматической настройкой Nginx certbot --nginx -d example.com -d www.example.com # Получение сертификата без изменения конфигурации Nginx certbot certonly --nginx -d example.com -d www.example.com # Получение wildcard-сертификата (требует DNS-проверку) certbot certonly --manual --preferred-challenges=dns -d example.com -d *.example.com
Автоматическое обновление сертификатов
Сертификаты Let's Encrypt действительны всего 90 дней, поэтому их необходимо регулярно обновлять. Certbot автоматически создаёт задачу в cron для обновления сертификатов:
# Проверка настройки автоматического обновления systemctl list-timers | grep certbot # Ручное тестирование процесса обновления (без фактического обновления) certbot renew --dry-run # Настройка автоматического перезапуска Nginx после обновления сертификата echo 'deploy_hook = systemctl reload nginx' >> /etc/letsencrypt/cli.ini
Важно!
Для успешного получения сертификата Let's Encrypt, ваш сервер должен быть доступен из интернета по доменному имени, для которого вы запрашиваете сертификат. Убедитесь, что настроены DNS-записи, и открыт доступ к HTTP-порту (80) или HTTPS-порту (443) для проверки владения доменом.
4. Базовая настройка SSL в Nginx
Теперь, когда у нас есть сертификат, давайте настроим Nginx для его использования. Рассмотрим базовую конфигурацию SSL для типичного веб-сайта.
Расположение файлов сертификатов
После получения сертификата с помощью Certbot, файлы будут сохранены в следующих местах:
- /etc/letsencrypt/live/example.com/fullchain.pem — полная цепочка сертификатов
- /etc/letsencrypt/live/example.com/privkey.pem — приватный ключ
- /etc/letsencrypt/live/example.com/cert.pem — сертификат домена
- /etc/letsencrypt/live/example.com/chain.pem — цепочка сертификатов CA
Базовая конфигурация SSL-сервера в Nginx
Добавьте следующую конфигурацию в ваш файл виртуального хоста:
server { listen 443 ssl; server_name example.com www.example.com; # Пути к SSL-сертификатам ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Базовые настройки SSL ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; # ~40000 сессий ssl_session_tickets off; # Корневой каталог и индексный файл root /var/www/example.com; index index.html index.htm index.php; # Обработка запросов location / { try_files $uri $uri/ =404; } # Настройки PHP (если используется) location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; } }
Проверка конфигурации и перезапуск Nginx
После внесения изменений необходимо проверить конфигурацию и перезапустить Nginx:
# Проверка конфигурации на ошибки nginx -t # Перезапуск Nginx при успешной проверке systemctl reload nginx
Совет
Даже такая базовая конфигурация уже обеспечивает защищённое соединение, но для достижения максимальной безопасности и производительности рекомендуется настроить дополнительные параметры, которые мы рассмотрим в следующих разделах.
5. Настройка безопасных шифров
Выбор правильных протоколов и шифров критически важен для безопасности. Устаревшие протоколы (SSL 2.0, SSL 3.0, TLS 1.0, TLS 1.1) и небезопасные шифры могут сделать ваше соединение уязвимым для атак.
Протоколы и шифры
Рекомендуемая конфигурация протоколов и шифров для современных веб-серверов:
# Современные, безопасные настройки SSL ssl_protocols TLSv1.2 TLSv1.3; # Предпочтительные шифры для 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; # Предпочтение серверных шифров (сервер выбирает наиболее безопасный доступный шифр) ssl_prefer_server_ciphers on; # Параметры Диффи-Хеллмана ssl_dhparam /etc/nginx/ssl/dhparam.pem;
Генерация параметров Диффи-Хеллмана
Для повышения безопасности обмена ключами следует сгенерировать собственные параметры Диффи-Хеллмана:
# Создание директории для SSL-параметров mkdir -p /etc/nginx/ssl # Генерация параметров Диффи-Хеллмана (может занять некоторое время) openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
Примечание
Хотя рекомендуется использовать 4096-битные параметры Диффи-Хеллмана для максимальной безопасности, генерация таких параметров может занять очень долгое время на серверах с ограниченными ресурсами. 2048 бит обеспечивает достаточный уровень безопасности для большинства применений.
Кривые эллиптической криптографии
Современные шифры используют эллиптические кривые для обмена ключами. Укажем безопасные кривые:
# Определение используемых кривых эллиптической криптографии ssl_ecdh_curve X25519:prime256v1:secp384r1;
Баланс между безопасностью и совместимостью
При выборе протоколов и шифров необходимо найти баланс:
6. OCSP Stapling
OCSP (Online Certificate Status Protocol) позволяет проверить, не был ли отозван сертификат. Обычно браузеры сами отправляют запросы к серверам OCSP центра сертификации, что может замедлить загрузку страницы и создать проблемы с приватностью.
OCSP Stapling решает эти проблемы — сервер сам периодически получает ответы OCSP и "прикрепляет" (staples) их к SSL-рукопожатию.
Настройка OCSP Stapling в Nginx
Добавьте следующие директивы в блок server для включения OCSP Stapling:
# Включение OCSP Stapling ssl_stapling on; ssl_stapling_verify on; # Добавление DNS-серверов для разрешения OCSP-запросов resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # Полный путь к цепочке сертификатов (уже указан в ssl_certificate) ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
Проверка работы OCSP Stapling
После настройки можно проверить, работает ли OCSP Stapling на вашем сервере:
# Проверка с помощью OpenSSL openssl s_client -connect example.com:443 -servername example.com -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"
Если OCSP Stapling работает правильно, вы увидите ответ, содержащий "OCSP Response Status: successful".
Преимущества OCSP Stapling
Скорость: клиентам не нужно делать отдельные запросы к серверам
OCSP
Приватность: центры сертификации не видят, какие сайты посещают
пользователи
Надёжность: сайт продолжает работать, даже если сервер OCSP
недоступен
7. Настройка HTTP/2
HTTP/2 — это новая версия протокола HTTP, которая значительно повышает скорость загрузки сайтов благодаря мультиплексированию запросов, сжатию заголовков и другим оптимизациям. Современные браузеры поддерживают HTTP/2 только через HTTPS.
Включение HTTP/2 в Nginx
Включить HTTP/2 в Nginx очень просто — достаточно добавить параметр 'http2' к директиве 'listen':
# Исходная директива listen 443 ssl; # Директива с включенным HTTP/2 listen 443 ssl http2;
Полный пример конфигурации с HTTP/2:
server { listen 443 ssl http2; listen [::]:443 ssl http2; # Для IPv6 server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Остальные настройки SSL... root /var/www/example.com; index index.html index.htm index.php; location / { try_files $uri $uri/ =404; } }
Проверка работы HTTP/2
После настройки и перезапуска Nginx можно проверить, работает ли HTTP/2:
# Проверка с помощью curl curl -I --http2 https://example.com/ # Проверка с помощью OpenSSL и nghttp nghttp -v https://example.com/
Совет
HTTP/2 особенно эффективен для сайтов с большим количеством мелких ресурсов (скрипты, стили, изображения). Модульные JavaScript-фреймворки, CSS-фреймворки и сложные макеты сильнее всего выигрывают от перехода на HTTP/2.
HTTP/3 (QUIC) - будущее веб-протоколов
HTTP/3 использует протокол QUIC, основанный на UDP вместо TCP, что обеспечивает еще большую производительность, особенно в нестабильных сетях. Поддержка HTTP/3 доступна в экспериментальных сборках Nginx и в модуле nginx-quic.
# Пример конфигурации для HTTP/3 (требует специальной сборки Nginx) server { listen 443 ssl http2; listen 443 quic; http3_max_concurrent_streams 128; # Объявление поддержки HTTP/3 для клиентов add_header Alt-Svc 'h3=":443"; ma=86400'; # Остальные настройки SSL и сервера... }
8. HTTP Strict Transport Security (HSTS)
HSTS — это механизм безопасности, который указывает браузерам взаимодействовать с сайтом только через HTTPS, даже если пользователь вручную вводит HTTP-URL или переходит по HTTP-ссылке. Это защищает от атак типа SSL-stripping, при которых злоумышленник пытается понизить соединение с HTTPS до HTTP.
Настройка HSTS в Nginx
Добавьте следующую директиву в блок server:
# Базовая настройка HSTS (срок действия 6 месяцев) add_header Strict-Transport-Security "max-age=15768000" always; # Расширенная настройка HSTS (включая поддомены) add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always; # HSTS с preload (для включения в предзагруженный список браузеров) add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
Важно!
Будьте осторожны при включении HSTS, особенно с параметрами includeSubDomains и preload. Убедитесь, что все поддомены правильно настроены для работы через HTTPS, иначе они станут недоступны для пользователей. После включения HSTS в режиме preload, отключить его будет очень сложно, так как информация о домене сохраняется в браузерах.
Включение в предзагруженный список HSTS
Для максимальной защиты вы можете добавить свой домен в предзагруженный список HSTS, который включен в основные браузеры. Тогда даже при первом посещении сайта браузер будет использовать только HTTPS:
- Настройте HSTS с параметром preload
- Зарегистрируйте домен на сайте hstspreload.org
- Следуйте инструкциям для проверки и добавления вашего домена
Примечание
HSTS-заголовок должен отправляться только через HTTPS. При настройке редиректа с HTTP на HTTPS не добавляйте заголовок HSTS к HTTP-ответам, это может привести к ошибкам в некоторых браузерах.
9. Перенаправление с HTTP на HTTPS
Даже после настройки HTTPS важно настроить автоматическое перенаправление с HTTP на HTTPS, чтобы пользователи всегда попадали на защищённую версию сайта.
Настройка редиректа в Nginx
Добавьте отдельный блок server для HTTP-подключений:
server { listen 80; listen [::]:80; server_name example.com www.example.com; # Перенаправление всех HTTP-запросов на HTTPS с сохранением URL location / { return 301 https://$host$request_uri; } # Место для обработки запросов Let's Encrypt location /.well-known/acme-challenge/ { root /var/www/letsencrypt; } }
Редирект с учётом www и non-www версий
Часто требуется одновременно перенаправлять с HTTP на HTTPS и унифицировать использование www:
# Перенаправление с HTTP на HTTPS и с www на без www server { listen 80; listen [::]:80; server_name example.com www.example.com; location / { return 301 https://example.com$request_uri; } location /.well-known/acme-challenge/ { root /var/www/letsencrypt; } } # Перенаправление с HTTPS www на HTTPS без www server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Базовые настройки SSL (можно вынести в отдельный конфиг) ssl_protocols TLSv1.2 TLSv1.3; # ... другие настройки SSL ... location / { return 301 https://example.com$request_uri; } }
Совет
Для уменьшения дублирования кода в конфигурации Nginx, вынесите общие SSL-настройки в отдельный файл и подключайте его с помощью директивы `include`:
# Создайте файл с общими настройками nano /etc/nginx/snippets/ssl-params.conf # В файле виртуального хоста server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Подключение общих SSL-параметров include snippets/ssl-params.conf; # Остальные настройки сервера... }
10. Тестирование SSL-конфигурации
После настройки HTTPS важно проверить, насколько безопасна ваша конфигурация. Существует несколько полезных инструментов для оценки безопасности SSL/TLS.
Онлайн-сервисы для проверки SSL
Эти сервисы анализируют настройки SSL/TLS вашего сайта и выдают оценку безопасности:
- SSL Labs Server Test — наиболее полный анализ конфигурации SSL
- ImmuniWeb SSL Test — проверка соответствия требованиям PCI DSS, HIPAA, NIST
- Hardenize — анализ различных аспектов безопасности, включая SSL
- SSL Shopper — проверка цепочки сертификатов и срока действия
Локальная проверка с помощью OpenSSL
OpenSSL позволяет проверить различные аспекты SSL-конфигурации:
# Проверка поддерживаемых протоколов openssl s_client -connect example.com:443 -tls1_2 openssl s_client -connect example.com:443 -tls1_3 # Проверка срока действия сертификата echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates # Проверка цепочки сертификатов openssl s_client -connect example.com:443 -showcerts # Проверка OCSP Stapling openssl s_client -connect example.com:443 -status # Проверка шифров nmap --script ssl-enum-ciphers -p 443 example.com
Что проверять в SSL-конфигурации
Обратите внимание на следующие аспекты при тестировании:
- Оценка безопасности — стремитесь к оценке A+ на SSL Labs
- Протоколы — используйте только TLSv1.2 и TLSv1.3
- Шифры — избегайте устаревших и небезопасных шифров
- Уязвимости — отсутствие известных уязвимостей (Heartbleed, POODLE, BEAST)
- Цепочка сертификатов — правильное построение цепочки сертификатов
- OCSP Stapling — правильная работа OCSP Stapling
- Forward Secrecy — поддержка совершенной прямой секретности
- HTTP/2 — корректная работа HTTP/2
Типичные оценки SSL Labs
Заключение
Правильная настройка SSL/TLS в Nginx — это не просто установка сертификата, а комплекс мер для обеспечения максимальной безопасности и производительности. В этой статье мы рассмотрели все ключевые аспекты современной HTTPS-конфигурации.
Вот краткий чек-лист для обеспечения безопасного HTTPS-соединения:
- Получите и установите SSL-сертификат — Let's Encrypt предлагает бесплатные и автоматически обновляемые сертификаты
- Настройте современные протоколы и шифры — используйте только TLS 1.2 и TLS 1.3 с безопасными шифрами
- Включите OCSP Stapling — для повышения производительности и приватности
- Настройте HTTP/2 — для улучшения скорости загрузки сайта
- Активируйте HSTS — чтобы предотвратить атаки с понижением протокола
- Настройте перенаправление с HTTP на HTTPS — чтобы все пользователи использовали защищённое соединение
- Регулярно тестируйте конфигурацию — используйте SSL Labs и другие инструменты для проверки безопасности
- Автоматизируйте обновление сертификатов — настройте cron-задачи для Certbot
- Следите за новостями о безопасности — будьте в курсе новых уязвимостей и обновлений
Безопасность веб-серверов — это непрерывный процесс, требующий регулярного внимания и обновлений. Современные стандарты и требования безопасности постоянно развиваются, поэтому важно следить за новостями и рекомендациями по безопасности и своевременно обновлять конфигурацию.
Потратив время на правильную настройку SSL/TLS в Nginx сегодня, вы обеспечите надёжную защиту данных ваших пользователей и повысите доверие к вашему сайту.
Заключительный совет
Создайте шаблон SSL-конфигурации с оптимальными настройками и используйте его для всех ваших проектов. Храните его в системе контроля версий, постоянно обновляя в соответствии с новыми рекомендациями и лучшими практиками. Это сэкономит время при настройке новых серверов и обеспечит единообразие настроек безопасности во всей вашей инфраструктуре.
Дмитрий Ковалев
16 февраля 2025Отличная статья! Очень детально описана настройка SSL. Только хотел уточнить по поводу HTTP/3 - есть ли уже стабильная поддержка в Nginx из коробки или всё еще нужно использовать патчи? И как насчет совместимости с браузерами, особенно мобильными?