Настройка HTTPS в Nginx: пошаговая инструкция с SSL/TLS | AdminWiki

Полное руководство по настройке HTTPS в Nginx: от Let's Encrypt до продвинутых конфигураций

18 декабря 2025 8 мин. чтения #Let's Encrypt #devops #https #nginx #ssl #tls #web сервер #безопасность

Представь, что твой веб-сервер — это крепость. HTTP — это ворота без замка, а HTTPS — это те же ворота, но с бронированными засовами, системой распознавания лиц и охраной. В современном интернете использование HTTPS не просто рекомендация — это обязательное требование для безопасности пользователей и SEO. Давай разберем, как правильно настроить HTTPS в Nginx, чтобы твои сайты были не только быстрыми, но и максимально защищенными.

Подготовка к настройке HTTPS

Перед тем как погрузиться в конфигурацию, убедись, что у тебя есть:

  • Установленный и работающий Nginx (версии 1.10.0 или выше)
  • Доступ к серверу с правами sudo/root
  • Зарегистрированное доменное имя, указывающее на IP-адрес твоего сервера
  • Открытые порты 80 и 443 в фаерволе
Важно: Современные браузеры помечают сайты без HTTPS как "небезопасные". Кроме того, поисковые системы ранжируют HTTPS-сайты выше в результатах поиска.

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

Есть несколько способов получить SSL-сертификат. Рассмотрим два самых популярных варианта.

1. Бесплатные сертификаты от Let's Encrypt

Let's Encrypt — это некоммерческий центр сертификации, предоставляющий бесплатные SSL-сертификаты. Установим Certbot — официальный клиент для работы с Let's Encrypt.

bash
# Для Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx

# Для CentOS/RHEL 8+
sudo dnf install certbot python3-certbot-nginx

# Для CentOS/RHEL 7
sudo yum install certbot python2-certbot-nginx

Теперь получим сертификат для домена:

bash
sudo certbot --nginx -d example.com -d www.example.com
Внимание: Certbot автоматически изменит конфигурацию Nginx. Если у тебя сложная кастомная конфигурация, лучше использовать флаг --certonly и настроить Nginx вручную.

2. Коммерческие SSL-сертификаты

Если тебе нужен OV или EV сертификат, придется приобрести его у коммерческого провайдера. После покупки ты получишь несколько файлов:

  • domain.crt — сертификат домена
  • ca_bundle.crt — цепочка доверия (intermediate certificate)
  • private.key — приватный ключ (никому не передавай!)

Базовая настройка HTTPS в Nginx

Давай создадим минимальную, но рабочую конфигурацию HTTPS. Предположим, у тебя уже есть сертификат и ключ.

config
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    # Пути к SSL-сертификатам
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;

    # Рекомендуемые настройки SSL
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    # Корневая директория сайта
    root /var/www/example.com/html;
    index index.html index.htm index.nginx-debian.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Настройка редиректа с HTTP на HTTPS

Чтобы все пользователи автоматически переходили на защищенную версию сайта, добавь этот блок:

config
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    
    # Редирект на HTTPS
    return 301 https://$server_name$request_uri;
}

Продвинутая оптимизация HTTPS

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

1. Настройка HTTP/2

HTTP/2 значительно ускоряет загрузку сайтов. Включить его просто — добавь http2 к директиве listen (как в примере выше).

2. Включение HSTS (HTTP Strict Transport Security)

HSTS заставляет браузеры всегда использовать HTTPS для этого домена, даже если пользователь введет http://

config
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Осторожно с HSTS: После включения с большим max-age откатиться к HTTP будет очень сложно. Сначала протестируй с небольшим значением, например max-age=300.

3. Оптимизация SSL-сессий

Правильная настройка кэширования SSL-сессий снижает нагрузку на CPU:

config
# В блоке http (не server!)
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;

# Диффи-Хеллман параметры для Perfect Forward Secrecy
ssl_dhparam /etc/nginx/dhparam.pem;

# Генерация dhparam (занимает время!)
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096

4. Современные шифры и протоколы

Используй только безопасные настройки:

config
ssl_protocols TLSv1.2 TLSv1.3;
# Современная конфигурация шифров от Mozilla
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 off;

Автоматическое обновление Let's Encrypt

Сертификаты Let's Encrypt действительны 90 дней. Настроим автоматическое обновление:

bash
# Тестовый запуск (без реального обновления)
sudo certbot renew --dry-run

# Добавляем в cron для автоматического обновления
sudo crontab -e
# Добавляем строку (запуск каждый день в 3:00)
0 3 * * * /usr/bin/certbot renew --quiet

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

После всех настроек обязательно проверь:

bash
# Проверка синтаксиса Nginx
sudo nginx -t

# Если всё ок, перезагрузи конфигурацию
sudo systemctl reload nginx
# или
sudo nginx -s reload

Проверить качество настройки SSL можно с помощью онлайн-инструментов:

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

Проблема Причина Решение
"NET::ERR_CERT_COMMON_NAME_INVALID" Имя в сертификате не совпадает с доменом Проверь server_name и домен в сертификате
Сайт не открывается по HTTPS Порт 443 закрыт или не слушается Проверь фаервол: sudo ufw status
Ошибка "SSL_CTX_use_PrivateKey" Несовпадение ключа и сертификата Перевыпусти сертификат или проверь пары ключ-сертификат
Медленная загрузка Нет HTTP/2 или слабые шифры Включи HTTP/2, обнови шифры до современных

Полный пример конфигурации

Вот пример полной, оптимизированной конфигурации для production-окружения:

config
# /etc/nginx/sites-available/example.com

# HTTP → HTTPS редирект
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

# Основной HTTPS сервер
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    # SSL сертификаты (пути для Let's Encrypt)
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # Безопасность
    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;
    ssl_prefer_server_ciphers off;
    
    # HSTS
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    
    # Дополнительные заголовки безопасности
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    
    # Корневая директория
    root /var/www/example.com/html;
    index index.html index.htm;
    
    # Логи
    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;
    
    location / {
        try_files $uri $uri/ =404;
    }
    
    # Блокируем доступ к скрытым файлам
    location ~ /\. {
        deny all;
    }
    
    # Оптимизация для статических файлов
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

Часто задаваемые вопросы (FAQ)

Какой размер ключа использовать для SSL?

Для RSA ключей рекомендуется 2048 бит как минимум, а лучше 4096 бит. Для ECC ключей достаточно 256 бит (секьюрити эквивалентна RSA 3072 бит). Let's Encrypt по умолчанию использует 2048 бит RSA.

Нужно ли покупать SSL-сертификат или хватит Let's Encrypt?

Для 95% случаев Let's Encrypt более чем достаточно. Коммерческие сертификаты нужны только если: 1) Требуется расширенная проверка (EV) для зеленой строки в браузере; 2) Нужна гарантия возмещения ущерба; 3) Корпоративные политики требуют конкретного вендора.

Почему после настройки HTTPS сайт стал медленнее?

HTTPS добавляет overhead из-за шифрования, но с современным железом это незаметно. Если есть проблемы: 1) Включи HTTP/2; 2) Используйте session resumption; 3) Включи OCSP stapling; 4) Убедись, что используешь современные шифры (не RC4, не 3DES).

Как настроить HTTPS для нескольких доменов на одном сервере?

Есть два подхода: 1) Использовать отдельные блоки server для каждого домена; 2) Использовать SNI (Server Name Indication) — современный метод, позволяющий размещать несколько SSL-сертификатов на одном IP-адресе. Nginx поддерживает SNI по умолчанию в современных версиях.

Что такое OCSP Stapling и как его включить?

OCSP Stapling уменьшает время загрузки, позволяя серверу кэшировать ответ от центра сертификации. Включи добавлением в конфиг: ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/fullchain.pem; Убедись, что в fullchain.pem включены intermediate сертификаты.

Профессиональный совет: Всегда тестируй изменения на staging-окружении перед production. Используй nginx -t для проверки синтаксиса и онлайн-инструменты для проверки безопасности.

Настройка HTTPS в Nginx — это не разовая задача, а процесс. Регулярно обновляй Nginx, следи за новыми уязвимостями в протоколах и шифрах, и используй автоматическое обновление сертификатов. Современный веб без HTTPS — это как дом без дверей: может, и стоит, но жить в нем опасно.

Помни: безопасность — это не пункт назначения, а постоянное путешествие. Каждая настройка, каждый заголовок, каждый шифр — это еще один кирпич в стене, защищающей твоих пользователей.

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