Как запустить локальный сервер разработки Django по протоколу HTTPS

Как запустить локальный сервер разработки Django по протоколу HTTPS

Иногда при разработки веб-приложения возникает необходимость протестировать его  работу по протоколу https. Например, мне понадобилось это когда я прикручивал моему приложению авторизацию через социальные сети.

Получить сертификат Let’s Encrypt для localhost невозможно. Можно сгенерировать самоподписаный сертификат через openssl, но он вызовет ошибки доверия в браузерах. Его нужно будет не забыть добавить в доверенное хранилище… короче можно сделать проще )

Можно воспользоваться кроссплатформенной утилитой mkcert, которая сгенерирует локально-доверенный сертификат с собственным центром сертификации.

Устанавливаем mkcert и генерируем сертификаты

  1. В репозитории утилиты на Гитхабе есть инструкции по установки на все операционные системы. Я скачал бинарный файл и переименовал его в mkcert.exe
  2. Дальше открываем командную строку от Администратора, переходим в папку с этим файлом и выполняем:

mkcert -install

Вот что выдает после выполнения:

Запуск утилиты mkcert

Как я понял в браузере Firefox на моем компьютере это работать не будет, но я им все-равно не пользуюсь поэтому разбираться не стал.

Мы заставили нашу операционную систему доверять локальным сертификатам, которые мы будем генерировать.

 C:\Users\<your username>\AppData\Local\mkcert

Далее нам необходимо сгенерировать сертификат для домена localhost, для этого выполняем команду:

mkcert -cert-file cert.pem -key-file key.pem localhost 127.0.0.1

Генерация сертификата утилитой mkcert

В папке где находится утилита 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

Тестовый сервер Django работает с HTTPS

Можно протестировать, проект доступен и по адресу https://127.0.0.1:8000/ и по https://localhost:8000/

К вашему сведению: вы можете повторно использовать этот сертификат с любым локальным проектом, который выполняется на localhost. Сертификат не имеет никакого отношения ни к Django или ни к Python.

Можно использовать mkcert при локальной разработке на PHP.

Хостинг для ваших проектов