Получение SSL сертификата от Let's Encrypt и настройка HTTPS
Зачем 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
Какой командой Certbot получить сертификат для myblog.ru и www.myblog.ru и автоматически настроить NGINX?
sudo certbot --nginx -d myblog.ru -d www.myblog.ruСколько действует сертификат Let's Encrypt?
Добавьте в настройки Django для работы за HTTPS: SECURE_PROXY_SSL_HEADER = кортеж
("HTTP_X_FORWARDED_PROTO", "https"), SESSION_COOKIE_SECURE = True, CSRF_COOKIE_SECURE = True,
SECURE_SSL_REDIRECT = True.
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True
Зачем Django нужна настройка SECURE_PROXY_SSL_HEADER, если HTTPS обслуживает NGINX?
Какой командой проверить, что автоматическое продление сертификатов сработает (тестовый прогон)?
Получите сертификат для своего домена и откройте сайт по https. Выполните curl -sI http://ВАШ_ДОМЕН | head -1 и вставьте строку статуса (должен быть редирект).
HTTP/1.1 301 Moved PermanentlyВойдите, чтобы отмечать пройденные уроки.