Skip to content

Latest commit

 

History

History
316 lines (200 loc) · 10.4 KB

File metadata and controls

316 lines (200 loc) · 10.4 KB

Модуль 10. Урок 70. Финальный этап: перевод сайта на HTTPS (SSL-сертификат)

К этому моменту мы с вами прошли почти весь путь деплоя Django-проекта cinemahub на виртуальный сервер:

  • проект развернут на VPS;
  • Django-приложение запущено через Gunicorn;
  • Nginx настроен как реверс-прокси;
  • корректно работают static и media файлы;
  • сайт открывается по обычному HTTP-протоколу.

Однако в современном интернете этого уже недостаточно.

Если сайт открывается по адресу вида:

http://cinemahub.ru

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

  • браузеры могут блокировать часть функционала;
  • поисковые системы (Google, Яндекс) понижают сайт в выдаче;
  • авторизация и передача данных происходят без шифрования.

Наша задача — перевести сайт на HTTPS, подключив SSL-сертификат.


Что такое SSL и откуда мы его возьмем

SSL-сертификат — это цифровой сертификат, который:

  • шифрует данные между браузером пользователя и сервером;
  • подтверждает, что домен действительно принадлежит вам;
  • позволяет использовать протокол https://.

Большинство SSL-сертификатов являются платными, однако существует бесплатный и полностью легальный вариант — сертификаты от центра сертификации Let’s Encrypt:

https://letsencrypt.org/ru/

Эти сертификаты:

  • бесплатны;
  • действуют 90 дней;
  • автоматически продлеваются;
  • используются миллионами сайтов по всему миру.

Certbot — инструмент для автоматической работы с SSL

Чтобы не выпускать и не обновлять сертификаты вручную, используется утилита Certbot:

https://certbot.eff.org/pages/about

Certbot:

  • сам получает SSL-сертификат;
  • автоматически настраивает Nginx;
  • умеет продлевать сертификаты без нашего участия.

Мы будем работать именно с ним.


Шаг 1. Установка Certbot на сервер

Подключаемся к серверу по SSH и выполняем команду:

sudo apt install certbot python3-certbot-nginx -y

Что здесь происходит:

  • certbot — основная утилита;
  • python3-certbot-nginx — модуль, который автоматически интегрируется с Nginx и правит его конфигурацию.

После выполнения команды Certbot будет установлен и готов к работе.


Шаг 2. Получение SSL-сертификата для домена

Теперь запускаем процесс выпуска сертификата. Вместо cinemahub.ru укажите свой домен:

sudo certbot --nginx -d cinemahub.ru

Что вы увидите в процессе

  1. Certbot попросит указать email Указывайте реальный адрес — на него могут приходить уведомления о проблемах с сертификатом.

  2. Подтверждение условий использования Вводим y.

  3. Вопрос о перенаправлении HTTP → HTTPS Соглашаемся, выбирая вариант с автоматическим редиректом.

Если все прошло успешно, вы увидите сообщение о том, что сертификат выдан.


Если возникает ошибка Invalid response from http://www.cinemahub.ru/.well-known/acme-challenge/:

Скорее всего это проблема конфигурации Nginx + Django/Gunicorn.

Let’s Encrypt работает так:

  1. Certbot говорит Nginx: «Разреши мне временно отдавать файлы из /.well-known/acme-challenge/»
  2. Let’s Encrypt заходит по HTTP (не HTTPS!) и проверяет файл
  3. Если файл отдался — домен подтверждён

У тебя шаг 2 падает с 500, значит:

Nginx пытается проксировать запрос в Gunicorn, а Gunicorn либо не отвечает, либо падает, либо Django ломается.


Самая частая причина в Django-проектах, когда DEBUG = False, но ALLOWED_HOSTS настроен неправильно. Certbot делает HTTP-запрос к домену, а не к localhost.

Добавьте в ALLOWED_HOSTS недостающие адреса:

ALLOWED_HOSTS = [
    'ipotnin.ru',
    'www.ipotnin.ru',
    '5.101.152.216',   # IP вашего сервера — ВАЖНО
    'localhost',
    '127.0.0.1',
]

После этого перезапустите Gunicorn:

sudo systemctl restart gunicorn

Перед повторной попыткой Certbot ОБЯЗАТЕЛЬНО проверьте результат в браузере пока через протокол http: http://cinemahub.ru.


Далее проверяем статус Gunicorn

sudo systemctl status gunicorn

Если видишь:

  • active (running) — ок
  • failed / exit-code — Certbot не сможет пройти

Если Certbot всё равно падает, делаем ручную страховку.

Открой конфиг Nginx проекта:

sudo nano /etc/nginx/sites-available/myproject

ВНУТРИ server {} ДО location / { добавь:

location ^~ /.well-known/acme-challenge/ {
    root /var/www/html;
    allow all;
}

Полный порядок важен — этот блок должен быть выше прокси.

Создай папку:

sudo mkdir -p /var/www/html/.well-known/acme-challenge
sudo chmod -R 755 /var/www/html

Перезапусти Nginx:

sudo nginx -t
sudo systemctl reload nginx

Шаг 3. Проверка результата в браузере

Теперь откройте в браузере:

https://cinemahub.ru

Ожидаемый результат:

  • сайт открывается по HTTPS;
  • в адресной строке — замок;
  • предупреждений о небезопасном соединении нет.

Также проверьте:

http://cinemahub.ru

Он должен автоматически перенаправлять на HTTPS.

На этом этапе Django-настройки базы данных (PostgreSQL / SQLite) не имеют значения — SSL работает на уровне Nginx.


Шаг 4. Что именно изменил Certbot

Важно понимать, что произошло «под капотом».

Certbot:

  • добавил SSL-настройки в конфигурацию Nginx;
  • создал новые server-блоки для listen 443 ssl;
  • прописал пути к сертификатам Let’s Encrypt;
  • добавил редирект с HTTP на HTTPS.

Вы можете открыть файл:

/etc/nginx/sites-available/myproject

и увидеть, что конфигурация стала заметно больше — это нормально.


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

Сертификаты Let’s Encrypt действуют 90 дней, но мы не будем продлевать их вручную.

Certbot устанавливает системный таймер:

sudo systemctl status certbot.timer

Если вы видите статус active, значит:

  • сервис запущен;
  • сертификат будет автоматически продлеваться;
  • никаких действий от вас не требуется.

Шаг 6. Тестирование механизма продления

Чтобы убедиться, что автоматическое продление точно сработает, выполним тест:

sudo certbot renew --dry-run

Это симуляция продления, сертификат реально не обновляется.

Если команда завершилась без ошибок, значит:

  • при реальном истечении срока сертификат продлится автоматически;
  • сайт не «упадет» через 90 дней.

Возможные проблемы и их причины

Certbot не может получить сертификат

Причины:

  • домен не указывает на IP сервера;
  • порт 80 или 443 закрыт firewall’ом;
  • Nginx не запущен.

Проверьте:

sudo systemctl status nginx
sudo ufw status

HTTPS работает, но сайт не открывается

Причины:

  • ошибка в конфигурации Nginx;
  • Gunicorn не запущен;
  • неверный путь к site.sock.

Проверьте:

sudo nginx -t
sudo systemctl status gunicorn

Предыдущий урок | Следующий урок