Установка 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.
Что мы сделаем
- Установим Nginx
- Настроим брандмауэр (UFW/Firewalld)
- Установим certbot и сгенерируем сертификаты Let’s Encrypt
- Настроим безопасную SSL-конфигурацию
- Создадим виртуальный хост Nginx с HTTPS
- Протестируем конфигурацию и проверим на 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
Шаг 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
На 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.

Важно: если сервер находится за облачным балансировщиком или в провайдерской сети, дополнительно проверьте правила на уровне облачной панели.
Шаг 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/<ваш_домен>/

Дополнительно рекомендуется сгенерировать сильный 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
Шаг 6 — Тестирование и проверка
Откройте в браузере https://ваш_домен и проверьте, что сайт доступен по HTTPS. Если переход с http на https настроен, заход по http должен перенаправляться на https.
Для внешней валидации используйте тест SSL Labs: https://www.ssllabs.com/ssltest/ — введите домен и дождитесь результата. Ниже показаны примеры результатов для двух наборов шифров.


Вы должны получить оценку A+; отличия могут быть в поле «Cipher Strength» в зависимости от выбранного набора шифров.
Проверка OCSP Stapling из интерфейса SSL Labs отображает статус 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'
Проверка 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 и вы не хотите, чтобы инструмент вносил изменения сам.
Мини-методология безопасности (быстрая шпаргалка)
- Всегда делайте резервную копию конфигураций перед изменениями.
- Тестируйте nginx -t и просматривайте логи.
- Используйте сильные ключи (RSA 4096 или ECDSA 384).
- Включайте HSTS только после стабильного тестирования (вначале без includeSubdomains).
- Настройте автоматическое продление 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 защищает канал, но не заменяет правовую оценку хранения данных.
Тестовые сценарии и критерии приёмки
- Генерация сертификата: certbot успешно завершает процесс и файлы появляются в /etc/letsencrypt/live.
- Перенаправление: http://site -> https://site (301).
- Заголовки безопасности: Strict-Transport-Security, X-Frame-Options присутствуют.
- SSL Labs: оценка >= A.
Заключение
Вы настроили Nginx для безопасного приёма HTTPS-соединений с сертификатом Let’s Encrypt, добавили усиленные SSL-настройки и проверили результат внешним аудитом (SSL Labs). Для обслуживания оставьте включённым автоматическое обновление certbot и периодически пересматривайте шифры и политики безопасности.
Ссылки
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента