Как запустить локальный сервер разработки Django по протоколу HTTPS
Иногда при разработки веб-приложения возникает необходимость протестировать его работу по протоколу https. Например, мне понадобилось это когда я прикручивал моему приложению авторизацию через социальные сети.
Получить сертификат Let’s Encrypt для localhost невозможно. Можно сгенерировать самоподписаный сертификат через openssl, но он вызовет ошибки доверия в браузерах. Его нужно будет не забыть добавить в доверенное хранилище… короче можно сделать проще )
Можно воспользоваться кроссплатформенной утилитой mkcert, которая сгенерирует локально-доверенный сертификат с собственным центром сертификации.
Устанавливаем mkcert и генерируем сертификаты
- В репозитории утилиты на Гитхабе есть инструкции по установки на все операционные системы. Я скачал бинарный файл и переименовал его в mkcert.exe
- Дальше открываем командную строку от Администратора, переходим в папку с этим файлом и выполняем:
mkcert -install
Вот что выдает после выполнения:
Как я понял в браузере Firefox на моем компьютере это работать не будет, но я им все-равно не пользуюсь поэтому разбираться не стал.
Мы заставили нашу операционную систему доверять локальным сертификатам, которые мы будем генерировать.
C:\Users\<your username>\AppData\Local\mkcert
Далее нам необходимо сгенерировать сертификат для домена localhost, для этого выполняем команду:
mkcert -cert-file cert.pem -key-file key.pem localhost 127.0.0.1
В папке где находится утилита mkcert (в моем случае Downloads) были созданы файлы cert.pem и key.pem, их нужно скопировать в папку с проектом Джанго на одном уровне с manage.py. Так же желательно добавить эти файлы в .gitignore.
Настройка сервера разработки Django для работы с HTTPS
Локальный сервер Джанго (manage.py команда runserver) по умолчанию не поддерживает SSL. Для того чтобы все-таки заставить работать наш проект по протоколу https можно воспользоваться одним из 2 пакетов:
Django SSL Server — https://github.com/teddziuba/django-sslserver
Django Extensions — https://github.com/django-extensions/django-extensions
Второй пакет довольно функциональный и мне кажется избыточным только для задачи запуска проекта по https, поэтому воспользуюсь первым.
Устанавливаю его:
pip install django-sslserver
Далее необходимо добавить его в INSTALLED_APPS проекта Джанго:
INSTALLED_APPS = (
...
'sslserver',
...
)
Все, осталось только запустить тестовый сервер командой:
python manage.py runsslserver --certificate cert.pem --key key.pem
Можно протестировать, проект доступен и по адресу https://127.0.0.1:8000/ и по https://localhost:8000/
К вашему сведению: вы можете повторно использовать этот сертификат с любым локальным проектом, который выполняется на localhost. Сертификат не имеет никакого отношения ни к Django или ни к Python.
Можно использовать mkcert при локальной разработке на PHP.