Получение SSL сертификата от Let's Encrypt и настройка HTTPS

⏱ 20 мин · 🧩 заданий: 6

Зачем HTTPS

Без HTTPS пароли, cookie сессий и токены передаются открытым текстом — их может перехватить любой в той же Wi-Fi-сети. Кроме того, браузеры помечают HTTP-сайты как «Не защищено», а поисковики понижают их в выдаче.

Let's Encrypt — бесплатный центр сертификации. Утилита Certbot получает сертификат и сама настраивает NGINX.

Установка Certbot

sudo apt install certbot python3-certbot-nginx -y

Убедитесь, что DNS уже указывает на сервер, а в конфигурации NGINX правильный server_name — Let's Encrypt проверит, что домен ваш, обратившись к нему по HTTP.

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

sudo certbot --nginx -d myblog.ru -d www.myblog.ru

Certbot спросит email (для уведомлений) и согласие с условиями, получит сертификат и допишет в конфигурацию NGINX:

server {
    server_name myblog.ru www.myblog.ru;
    ...
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/myblog.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/myblog.ru/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    listen 80;
    server_name myblog.ru www.myblog.ru;
    return 301 https://$host$request_uri;
}

Второй блок перенаправляет все HTTP-запросы на HTTPS.

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

Сертификат действует 90 дней. Certbot устанавливает таймер systemd, который проверяет и продлевает сертификаты дважды в день. Проверьте:

sudo systemctl list-timers | grep certbot
sudo certbot renew --dry-run

Настройки Django

Теперь Django должен знать, что работает за HTTPS:

# NGINX передаёт X-Forwarded-Proto: https (из proxy_params)
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")

SECURE_SSL_REDIRECT = True        # редирект на HTTPS на уровне Django
SESSION_COOKIE_SECURE = True      # cookie сессии только по HTTPS
CSRF_COOKIE_SECURE = True         # cookie CSRF только по HTTPS
CSRF_TRUSTED_ORIGINS = ["https://myblog.ru", "https://www.myblog.ru"]

# HSTS: браузер будет всегда ходить по HTTPS
SECURE_HSTS_SECONDS = 3600        # начните с часа, потом увеличьте до 31536000 (год)
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True

HSTS осторожно

После включения HSTS браузеры откажутся открывать сайт по HTTP на заданный срок. Включайте большие значения, только когда уверены, что HTTPS работает стабильно на всех поддоменах.

Перезапустите Gunicorn и проверьте:

sudo systemctl restart gunicorn
python manage.py check --deploy

Откройте сайт — в адресной строке замок. Проверить качество настройки можно на ssllabs.com/ssltest.

Не забудьте

  • Обновите домен в админке «Сайты» (для sitemap) и callback-адреса OAuth-приложений на https://.
  • Проверьте, что отправка писем со ссылками использует https:// — это зависит от SECURE_PROXY_SSL_HEADER.

Итог

  • certbot --nginx -d домен -d www.домен — сертификат и настройка NGINX за минуту.
  • Продление автоматическое (таймер systemd), проверка — certbot renew --dry-run.
  • Django за прокси: SECURE_PROXY_SSL_HEADER, SECURE_SSL_REDIRECT, *_COOKIE_SECURE, CSRF_TRUSTED_ORIGINS, HSTS.

Практика решено 0 из 6

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Ввод ответа

Какой командой Certbot получить сертификат для myblog.ru и www.myblog.ru и автоматически настроить NGINX?

Задание 2 Один вариант ответа

Сколько действует сертификат Let's Encrypt?

Задание 3 Написать код

Добавьте в настройки Django для работы за HTTPS: SECURE_PROXY_SSL_HEADER = кортеж ("HTTP_X_FORWARDED_PROTO", "https"), SESSION_COOKIE_SECURE = True, CSRF_COOKIE_SECURE = True, SECURE_SSL_REDIRECT = True.

Задание 4 Один вариант ответа

Зачем Django нужна настройка SECURE_PROXY_SSL_HEADER, если HTTPS обслуживает NGINX?

Задание 5 Ввод ответа

Какой командой проверить, что автоматическое продление сертификатов сработает (тестовый прогон)?

Задание 6 Практика (выполнить у себя)

Получите сертификат для своего домена и откройте сайт по https. Выполните curl -sI http://ВАШ_ДОМЕН | head -1 и вставьте строку статуса (должен быть редирект).

Войдите, чтобы отмечать пройденные уроки.