В современном мире, где кибербезопасность становится всё более критичной, безопасное соединение с веб-сайтами через 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?

Процесс установления защищённого соединения состоит из нескольких этапов:

  1. Рукопожатие (Handshake) — клиент и сервер согласуют версию протокола и методы шифрования
  2. Обмен ключами — установление секретного ключа для шифрования данных
  3. Проверка сертификата — клиент проверяет подлинность сертификата сервера
  4. Шифрованная передача данных — защищённый обмен информацией
# Структура 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) — для нескольких разных доменов

Сравнение типов сертификатов

DV: быстрое получение (минуты), низкая стоимость, базовое доверие
OV: среднее время получения (дни), средняя стоимость, повышенное доверие
EV: длительное получение (недели), высокая стоимость, максимальное доверие

Коммерческие 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;

Баланс между безопасностью и совместимостью

При выборе протоколов и шифров необходимо найти баланс:

Только TLS 1.3: максимальная безопасность, но ограниченная совместимость (только новые браузеры)
TLS 1.2 + TLS 1.3: хорошая безопасность и широкая совместимость (рекомендуется)
Включение TLS 1.0/1.1: снижение безопасности, но поддержка устаревших систем

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:

  1. Настройте HSTS с параметром preload
  2. Зарегистрируйте домен на сайте hstspreload.org
  3. Следуйте инструкциям для проверки и добавления вашего домена

Примечание

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

A+ — Отличная конфигурация с HSTS и всеми современными расширениями безопасности
A — Хорошая конфигурация, но без некоторых дополнительных расширений
B — Приемлемая конфигурация, но есть что улучшить
C или ниже — Серьезные проблемы с безопасностью, требующие немедленного исправления

Заключение

Правильная настройка SSL/TLS в Nginx — это не просто установка сертификата, а комплекс мер для обеспечения максимальной безопасности и производительности. В этой статье мы рассмотрели все ключевые аспекты современной HTTPS-конфигурации.

Вот краткий чек-лист для обеспечения безопасного HTTPS-соединения:

  1. Получите и установите SSL-сертификат — Let's Encrypt предлагает бесплатные и автоматически обновляемые сертификаты
  2. Настройте современные протоколы и шифры — используйте только TLS 1.2 и TLS 1.3 с безопасными шифрами
  3. Включите OCSP Stapling — для повышения производительности и приватности
  4. Настройте HTTP/2 — для улучшения скорости загрузки сайта
  5. Активируйте HSTS — чтобы предотвратить атаки с понижением протокола
  6. Настройте перенаправление с HTTP на HTTPS — чтобы все пользователи использовали защищённое соединение
  7. Регулярно тестируйте конфигурацию — используйте SSL Labs и другие инструменты для проверки безопасности
  8. Автоматизируйте обновление сертификатов — настройте cron-задачи для Certbot
  9. Следите за новостями о безопасности — будьте в курсе новых уязвимостей и обновлений

Безопасность веб-серверов — это непрерывный процесс, требующий регулярного внимания и обновлений. Современные стандарты и требования безопасности постоянно развиваются, поэтому важно следить за новостями и рекомендациями по безопасности и своевременно обновлять конфигурацию.

Потратив время на правильную настройку SSL/TLS в Nginx сегодня, вы обеспечите надёжную защиту данных ваших пользователей и повысите доверие к вашему сайту.

Заключительный совет

Создайте шаблон SSL-конфигурации с оптимальными настройками и используйте его для всех ваших проектов. Храните его в системе контроля версий, постоянно обновляя в соответствии с новыми рекомендациями и лучшими практиками. Это сэкономит время при настройке новых серверов и обеспечит единообразие настроек безопасности во всей вашей инфраструктуре.

Похожие статьи

Прочитать статью об Nginx vs Apache

Оптимизация Nginx для высоконагруженных веб-приложений

22 января 2025 Читать →
Прочитать статью об Nginx vs Apache

Защита Apache от распространенных уязвимостей

5 марта 2025 Читать →
Прочитать статью об Nginx vs Apache

Nginx vs Apache: когда что использовать

18 декабря 2024 Читать →

Комментарии

Оставить комментарий

1 комментарий

Д

Дмитрий Ковалев

16 февраля 2025

Отличная статья! Очень детально описана настройка SSL. Только хотел уточнить по поводу HTTP/3 - есть ли уже стабильная поддержка в Nginx из коробки или всё еще нужно использовать патчи? И как насчет совместимости с браузерами, особенно мобильными?