Гид по технологиям

Установка Nginx и Let's Encrypt: настройка HTTPS с оценкой A+

• 7 min read • DevOps • Обновлено 26 Nov 2025
Nginx + Let's Encrypt: настройка HTTPS и A+
Nginx + Let's Encrypt: настройка HTTPS и A+

В этой пошаговой инструкции — установка Nginx на Ubuntu 18.04 и CentOS 7.5, настройка брандмауэра, получение бесплатного SSL от Let’s Encrypt через certbot, безопасная SSL-конфигурация и проверка на SSL Labs для достижения оценки A+. Включены контрольные списки, варианты альтернатив и рекомендации по устранению неполадок.

Предварительные требования

  • Linux сервер — Ubuntu 18.04 или CentOS 7.5
  • root-привилегии или доступ через sudo
  • доменное имя, указывающее на IP сервера (A/AAAA записи)

Важно: перед началом убедитесь, что домен корректно резолвится на сервер. Проверить можно командой dig или nslookup.

Что мы сделаем

  1. Установим Nginx
  2. Настроим брандмауэр (UFW/Firewalld)
  3. Установим certbot и сгенерируем сертификаты Let’s Encrypt
  4. Настроим безопасную SSL-конфигурацию
  5. Создадим виртуальный хост Nginx с HTTPS
  6. Протестируем конфигурацию и проверим на SSL Labs

Шаг 1 — Установка Nginx

Ниже приведены команды для Ubuntu 18.04 и для CentOS 7.5. Они сохраняют стандартную структуру пакетов и конфигураций для каждой дистрибуции.

На Ubuntu 18.04

Обновите кэш пакетов и установите nginx:

sudo apt update  
sudo apt install nginx -y

На CentOS 7.5

Установите репозиторий EPEL и сам nginx:

sudo yum install epel-release -y  
sudo yum install nginx -y

После установки запустите сервис и включите автозапуск при старте системы:

systemctl start nginx  
systemctl enable nginx

Проверка того, что Nginx слушает порт 80:

netstat -plntu

Установка Nginx и проверка службы

Шаг 2 — Настройка брандмауэра UFW и Firewalld

Рекомендуется включать брандмауэр и открывать только необходимые порты: SSH, HTTP и HTTPS. Ниже — команды для двух популярных инструментов в Ubuntu и CentOS.

На Ubuntu 18.04 — UFW

Перед включением UFW убедитесь, что правило для SSH добавлено, иначе вы можете потерять доступ по SSH.

ufw allow ssh  
ufw enable

Откройте HTTP и HTTPS:

ufw allow http  
ufw allow https

Проверка статуса:

ufw status

Настройка UFW: список правил

На CentOS 7.5 — Firewalld

Убедитесь, что firewalld запущен и включён:

systemctl start firewalld  
systemctl enable firewalld

Замечание: служба SSH обычно уже присутствует в зоне по умолчанию.

Откройте HTTP и HTTPS и примените изменения:

firewall-cmd --add-service=http --permanent  
firewall-cmd --add-service=https --permanent
firewall-cmd --reload  
firewall-cmd --list-services

Вы увидите в списке ssh, http, https.

Настройка Firewalld: службы

Важно: если сервер находится за облачным балансировщиком или в провайдерской сети, дополнительно проверьте правила на уровне облачной панели.

Шаг 3 — Установка certbot и получение сертификатов

Мы будем использовать certbot (Let’s Encrypt) в режиме webroot: certbot создаёт времальные файлы в директории .well-known для подтверждения владения доменом.

На Ubuntu 18.04

sudo apt install letsencrypt -y

На CentOS 7.5

sudo yum install certbot -y

После установки нужно подготовить конфигурацию Nginx так, чтобы сервер отдавал /.well-known — certbot положит туда токены.

На Ubuntu 18.04 — подготовка для certbot

cd /etc/nginx/  
vim snippets/certbot.conf

Вставьте:

    location /.well-known {
        alias /var/www/html/.well-known;
    }

Сохраните файл и отредактируйте default virtual host:

vim sites-available/default

Добавьте внутри server { … }:

    include snippets/certbot.conf;

На CentOS 7.5 — подготовка для certbot

cd /etc/nginx/  
vim default.d/certbot.conf

Вставьте:

    location /.well-known {
        alias /usr/share/nginx/html/.well-known;
    }

Проверка конфигурации и перезапуск nginx:

nginx -t  
systemctl restart nginx

Теперь можно запрашивать сертификат через certbot. Пример для домена hakase-labs.io (замените на ваш домен и почту):

На Ubuntu 18.04

certbot certonly --rsa-key-size 4096 --webroot --agree-tos --no-eff-email --email [email protected] -w /var/www/html -d hakase-labs.io

На CentOS 7.5

certbot certonly --rsa-key-size 4096 --webroot --agree-tos --no-eff-email --email [email protected] -w /usr/share/nginx/html -d hakase-labs.io

Примечание: мы выбираем rsa-key-size 4096 для более сильного ключа. Certbot создаст файлы в /etc/letsencrypt/live/<ваш_домен>/

Генерация сертификата Let's Encrypt

Дополнительно рекомендуется сгенерировать сильный dhparam для PFS (Perfect Forward Secrecy):

openssl dhparam -out /etc/nginx/dhparam.pem 4096

Генерация может занять время в зависимости от мощности CPU.

Шаг 4 — Безопасная SSL-конфигурация

Создадим файл конфигурации с настройками TLS и заголовками безопасности. Это централизует параметры и упростит обновления.

На Ubuntu 18.04

cd /etc/nginx/  
vim snippets/ssl.conf

На CentOS 7.5

cd /etc/nginx/  
vim default.d/ssl.conf

Вставьте следующую конфигурацию (комментарии оставлены для понимания):

# Specify the TLS versions
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

# Mozilla Ciphersuites Recommendation
# Use this for all devices supports
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:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';

# Use the DHPARAM key and ECDH curve >= 256bit
ssl_ecdh_curve secp384r1;
ssl_dhparam /etc/nginx/dhparam.pem;

server_tokens off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

# Enable HTTP Strict-Transport-Security
# If you have subdomains, be careful with includeSubdomains
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

# Enable OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/hakase-labs.io/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

# XSS and other protections
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header X-Robots-Tag none;

Сохраните файл. Пояснения:

  • ssl_protocols: указаны версии TLS; при желании можно отключить старые версии и оставить только TLSv1.2 и выше.
  • ssl_ciphers: рекомендуемый набор шифров от Mozilla для совместимости и безопасности.
  • HSTS: активирует принудительное использование HTTPS в браузерах.
  • OCSP Stapling: ускоряет проверку статуса сертификата и повышает приватность.

Важно: обновляйте путь к ssl_trusted_certificate под ваш домен и структуру сертификатов.

Шаг 5 — Конфигурация виртуального хоста Nginx с SSL

Создадим веб-рутовую директорию и простой тестовый индекс:

mkdir -p /var/www/site01  
echo '

Nginx - Letsencrypt - A+

' > /var/www/site01/index.html

Создайте конфигурацию виртуального хоста для домена. На Ubuntu это файл в sites-available, на CentOS — conf.d.

На Ubuntu 18.04

cd /etc/nginx/  
vim sites-available/hakase-labs.io

На CentOS 7.5

cd /etc/nginx/  
vim conf.d/hakase-labs.conf

Вставьте этот пример конфигурации (замените hakase-labs.io на ваш домен):

server {
    listen 80;
    listen [::]:80;
    server_name hakase-labs.io;

    return 301 https://$host$request_uri;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        root   /var/www/site01;
        index index.html index.php index.htm;

        server_name  hakase-labs.io;
        error_log /var/log/nginx/hakase-error.log warn;

        ssl_certificate /etc/letsencrypt/live/hakase-labs.io/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/hakase-labs.io/privkey.pem;

        #SSL Configuration
        include snippets/ssl.conf;

        location ~ /.well-known {
                allow all;
        }


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


        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }

}

Если на CentOS вы сохранили ssl.conf в default.d, замените include snippets/ssl.conf; на include default.d/ssl.conf; или отредактируйте путь согласно размещению файла.

На Ubuntu включите сайт и проверьте конфигурацию:

ln -s /etc/nginx/sites-available/hakase-labs.io /etc/nginx/sites-enabled/  
nginx -t
systemctl restart nginx

Проверьте, что порт 443 слушает:

netstat -plntu

Конфигурация Nginx и прослушивание портов

Шаг 6 — Тестирование и проверка

Откройте в браузере https://ваш_домен и проверьте, что сайт доступен по HTTPS. Если переход с http на https настроен, заход по http должен перенаправляться на https.

Для внешней валидации используйте тест SSL Labs: https://www.ssllabs.com/ssltest/ — введите домен и дождитесь результата. Ниже показаны примеры результатов для двух наборов шифров.

Результат A+ от SSL Labs - Mozilla Cipher Suite

Результат A+ от SSL Labs - Cipher.li Cipher Suite

Вы должны получить оценку A+; отличия могут быть в поле «Cipher Strength» в зависимости от выбранного набора шифров.

Проверка OCSP Stapling из интерфейса SSL Labs отображает статус OCSP Stapling.

Результат проверки OCSP Stapling

Проверка OCSP Stapling с командной строки:

echo QUIT | openssl s_client -connect hakase-labs.io:443 -status 2> /dev/null | grep -A 17 'OCSP response:' | grep -B 17 'Next Update'

Проверка OCSP через OpenSSL

Проверка HSTS с помощью curl:

curl -s -D- https://hakase-labs.io | grep -i Strict

Если заголовок Strict-Transport-Security присутствует — HSTS работает.

Контрольный список для приёма работы

  • Nginx установлен и запущен
  • Правила брандмауэра открывают 80 и 443
  • Домен резолвится на IP сервера
  • Сертификат получен и файлы доступны в /etc/letsencrypt/live/<домен>
  • dhparam сгенерирован и указан в ssl.conf
  • OCSP Stapling настроено и валидно
  • HSTS включён при необходимости
  • SSL Labs показывает оценку A или A+

Критерии приёмки

  • Сайт корректно редиректит все HTTP-запросы на HTTPS
  • HTTPS работает без предупреждений браузера (сертификат валиден)
  • В SSL Labs отсутствуют критические предупреждения и показана оценка A/A+
  • Заголовки безопасности присутствуют: HSTS, X-Frame-Options, X-Content-Type-Options

Частые проблемы и способы решения

Проблема: certbot не может пройти валидацию (HTTP challenge)

  • Проверьте, что /.well-known доступна по HTTP и создание файла в указанной webroot-директории возвращает его содержимое (используйте curl).
  • Убедитесь, что в конфигурации Nginx для location /.well-known указан правильный alias.

Проблема: Nginx не перезапускается после правки конфигурации

  • Выполните nginx -t для проверки синтаксиса.
  • Посмотрите журнал systemctl status nginx и /var/log/nginx/error.log.

Проблема: OCSP Stapling не работает

  • Убедитесь, что ssl_trusted_certificate указывает на полный цепочный файл (chain.pem или fullchain.pem в зависимости от CA).
  • Проверьте доступ к резолверам в директиве resolver; иногда провайдер блокирует внешние DNS.

Проблема: Плохая оценка в SSL Labs по причине поддерживаемых протоколов/шифров

  • Отключите старые протоколы TLS (оставьте TLSv1.2 и TLSv1.3, если поддерживается). TLSv1.0/1.1 устарели.
  • Обновите ssl_ciphers согласно современным рекомендациям (Mozilla, OWASP).

Альтернативные подходы и когда их выбирать

  • certbot –nginx плагин: автоматически правит конфигурацию Nginx и упрощает работу. Рекомендуется, если вы доверяете автоматике и хотите быстро настроить HTTPS.
  • acme.sh: легковесная альтернатива certbot, работает с разными ACME-CA и поддерживает DNS-валидацию через API провайдеров — полезно, если требуется wildcard-сертификат.
  • Использовать Cloudflare или обратный прокси: если вы используете CDN/обратный прокси, сертификат можно установить на уровне прокси, но при этом рекомендуется иметь тоже рабочий SSL на бекенде.

Когда не применять автоматические плагины:

  • Если у вас сложная кастомная конфигурация Nginx и вы не хотите, чтобы инструмент вносил изменения сам.

Мини-методология безопасности (быстрая шпаргалка)

  1. Всегда делайте резервную копию конфигураций перед изменениями.
  2. Тестируйте nginx -t и просматривайте логи.
  3. Используйте сильные ключи (RSA 4096 или ECDSA 384).
  4. Включайте HSTS только после стабильного тестирования (вначале без includeSubdomains).
  5. Настройте автоматическое продление certbot renew и проверяйте post-hook для перезагрузки nginx.

Пример автоматического обновления CRON (пример):

0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

Роль-ориентированные чеклисты

Администратор сервера:

  • Обновить пакеты и конфигурации
  • Настроить брандмауэр
  • Настроить cron/таймер для certbot renew

DevOps:

  • Интегрировать проверку конфигурации в CI (nginx -t)
  • Автоматизировать деплой сертификатов на несколько инстансов (если нужно)

Разработчик:

  • Убедиться, что все URL-адреса абсолютные и используют https при необходимости
  • Тестировать кэш и статические ресурсы через HTTPS

Краткий глоссарий

  • TLS: протокол шифрования для защищённого канала передачи данных.
  • certbot: клиент для автоматизации получения сертификатов от Let’s Encrypt.
  • dhparam: параметры Диффи-Хеллмана для обеспечения PFS.
  • OCSP Stapling: механизм ускоренной проверки статуса сертификата.
  • HSTS: механизм принудительного использования HTTPS браузером.

Примечания по безопасности и приватности

  • Let’s Encrypt не хранит содержимое ваших сайтов; он подтверждает владение доменом. Убедитесь, что логирование сертификатных операций не содержит чувствительных данных.
  • Для соответствия GDPR хранение и обработка персональных данных следует выполнять согласно политикам вашей организации; SSL защищает канал, но не заменяет правовую оценку хранения данных.

Тестовые сценарии и критерии приёмки

  1. Генерация сертификата: certbot успешно завершает процесс и файлы появляются в /etc/letsencrypt/live.
  2. Перенаправление: http://site -> https://site (301).
  3. Заголовки безопасности: Strict-Transport-Security, X-Frame-Options присутствуют.
  4. SSL Labs: оценка >= A.

Заключение

Вы настроили Nginx для безопасного приёма HTTPS-соединений с сертификатом Let’s Encrypt, добавили усиленные SSL-настройки и проверили результат внешним аудитом (SSL Labs). Для обслуживания оставьте включённым автоматическое обновление certbot и периодически пересматривайте шифры и политики безопасности.

Ссылки

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро