HTTPS и TLS-сертификаты в Nginx

Настройка защищённого доступа к сайту: домен, сертификат, Certbot, перенаправление с HTTP на HTTPS и проверка продления сертификата.

Цели занятия

На этом занятии настраивается защищённое подключение к сайту через HTTPS. Перед началом должен уже работать сайт на Nginx и должен быть открыт доступ к портам 80/tcp и 443/tcp.

Тема

HTTPS

Браузер подключается к сайту по защищённому каналу.

Инструмент

Certbot

Утилита для получения и обновления TLS-сертификатов.

Результат

Сайт с замком

Сайт открывается через https://, а HTTP перенаправляется на HTTPS.

После занятия студент должен уметь:

1. HTTP и HTTPS

HTTP передаёт данные между браузером и сервером без шифрования. HTTPS использует TLS-шифрование и защищает данные от перехвата и подмены.

Протокол Порт Шифрование Пример адреса
HTTP 80/tcp Нет http://example.com
HTTPS 443/tcp Да https://example.com

Зачем нужен TLS-сертификат

TLS-сертификат подтверждает, что браузер подключается к нужному домену, и позволяет зашифровать обмен данными между клиентом и сервером.

Если сайт принимает пароли, формы, личные данные или токены, он должен работать через HTTPS.

2. Что нужно до настройки HTTPS

Перед получением сертификата должны быть выполнены базовые условия.

Условие Как проверить
Есть домен Например, example.com.
Домен указывает на IP сервера dig example.com или ping example.com.
Nginx работает sudo systemctl status nginx.
Порт 80 открыт sudo ufw status.
Порт 443 открыт sudo ufw status.

Открытие портов

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status

Проверка Nginx

sudo nginx -t
sudo systemctl status nginx
Сертификат нельзя нормально получить, если домен не указывает на сервер или порт 80 заблокирован.

3. Установка Certbot

certbot — это утилита для получения TLS-сертификатов и настройки их продления.

Установка пакетов

sudo apt update
sudo apt install certbot python3-certbot-nginx -y

Получение сертификата для домена

sudo certbot --nginx -d example.com -d www.example.com

Вместо example.com нужно указать свой домен.

Что делает команда

Если используется только один домен без www, команда может быть такой: sudo certbot --nginx -d example.com.

4. Конфигурация Nginx до получения сертификата

До запуска Certbot в конфиге сайта должен быть правильный server_name. Нельзя оставлять только server_name _;, если сертификат нужен для настоящего домена.

Пример HTTP-конфига

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example;
    index index.html;

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

Проверка и применение

sudo nginx -t
sudo systemctl reload nginx
После изменения server_name всегда проверяйте конфигурацию командой sudo nginx -t.

5. Перенаправление с HTTP на HTTPS

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

Пример server-блока для редиректа

server {
    listen 80;
    server_name example.com www.example.com;

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

Основной HTTPS-блок

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    root /var/www/example;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
Certbot обычно добавляет строки с путями к сертификату автоматически. Их не нужно придумывать вручную.

6. Автоматическое продление сертификата

Сертификаты нужно регулярно продлевать. Certbot настраивает автоматическое продление, но его нужно уметь проверять.

Проверка таймера Certbot

systemctl list-timers | grep certbot

Тестовое продление

sudo certbot renew --dry-run

Просмотр установленных сертификатов

sudo certbot certificates
Если sudo certbot renew --dry-run завершился без ошибок, механизм продления работает корректно.

7. Диагностика ошибок HTTPS

Ошибки HTTPS нужно проверять по цепочке: домен, firewall, Nginx, Certbot, логи.

Проблема Возможная причина Проверка
Certbot не может получить сертификат Домен не указывает на сервер или закрыт порт 80 dig example.com, sudo ufw status
Сайт не открывается по HTTPS Закрыт порт 443 или ошибка в Nginx sudo nginx -t, sudo ss -tulpn | grep ':443'
Браузер показывает ошибку сертификата Сертификат выдан не на тот домен sudo certbot certificates
После настройки сайт перестал открываться Ошибка в server block sudo tail -n 100 /var/log/nginx/error.log

Команды для проверки

curl -I http://example.com
curl -I https://example.com
sudo nginx -t
sudo systemctl status nginx
sudo tail -n 100 /var/log/nginx/error.log

8. Практическая работа

Задание 1. Проверьте, что домен указывает на IP вашего сервера.
dig example.com
Задание 2. Проверьте, что Nginx работает и конфигурация не содержит ошибок.
sudo nginx -t
sudo systemctl status nginx
Задание 3. Разрешите HTTP и HTTPS в firewall.
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status
Задание 4. Установите Certbot и получите сертификат для своего домена.
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com
Задание 5. Проверьте сайт через HTTP и HTTPS.
curl -I http://example.com
curl -I https://example.com
Задание 6. Проверьте автоматическое продление сертификата.
sudo certbot renew --dry-run

9. Мини-проверка

Вопросы

  1. Чем HTTPS отличается от HTTP?
  2. Для чего нужен TLS-сертификат?
  3. Какой порт используется для HTTP?
  4. Какой порт используется для HTTPS?
  5. Почему перед получением сертификата домен должен указывать на сервер?
  6. Какая команда устанавливает Certbot для Nginx?
  7. Какая команда получает сертификат для домена?
  8. Зачем нужен редирект с HTTP на HTTPS?
  9. Как проверить конфигурацию Nginx?
  10. Как проверить тестовое продление сертификата?

Ответы для самопроверки

  1. HTTPS использует шифрование, HTTP не использует.
  2. Для подтверждения домена и шифрования соединения.
  3. 80/tcp.
  4. 443/tcp.
  5. Certbot должен подтвердить, что сервер управляет этим доменом.
  6. sudo apt install certbot python3-certbot-nginx -y.
  7. sudo certbot --nginx -d example.com.
  8. Чтобы пользователи всегда попадали на защищённую версию сайта.
  9. sudo nginx -t.
  10. sudo certbot renew --dry-run.

10. Итоговый порядок настройки HTTPS

1. Проверить домен:
   dig example.com

2. Проверить Nginx:
   sudo nginx -t
   sudo systemctl status nginx

3. Открыть порты:
   sudo ufw allow 80/tcp
   sudo ufw allow 443/tcp

4. Установить Certbot:
   sudo apt update
   sudo apt install certbot python3-certbot-nginx -y

5. Получить сертификат:
   sudo certbot --nginx -d example.com

6. Проверить сайт:
   curl -I https://example.com

7. Проверить продление:
   sudo certbot renew --dry-run
Главный вывод: HTTPS настраивается только после того, как домен, Nginx и firewall уже работают корректно.