Это не так просто, как встроенный сервер разработки, но не так уж сложно получить что-то близкое, используя stunnel в качестве SSL-посредника между вашим браузером и сервером разработки. Stunnel позволяет вам настроить легкий сервер на вашем компьютере, который принимает соединения через настроенный порт, обертывает их с помощью SSL и передает их другому серверу. Мы будем использовать это, чтобы открыть порт stunnel (8443) и передать любой трафик, который он получает, экземпляру сервера запуска Django.
Сначала вам понадобится stunnel, который можно скачать здесь или который может быть предоставлен системой пакетов вашей платформы (например :) apt-get install stunnel
. Я буду использовать stunnel версии 4 (например, /usr/bin/stunnel4
в Ubuntu), версия 3 также будет работать, но имеет другие параметры конфигурации.
Сначала создайте каталог в вашем проекте Django, чтобы хранить необходимые файлы конфигурации и материалы SSLish.
mkdir stunnel
cd stunnel
Затем нам нужно создать локальный сертификат и ключ, которые будут использоваться для связи SSL. Для этого обратимся к openssl.
Создайте ключ:
openssl genrsa 1024 > stunnel.key
Создайте сертификат, который использует этот ключ (вам будет предложено множество информации, которая будет включена в сертификат - просто ответьте тем, что вам нравится):
openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert
Теперь объедините их в один файл, который stunnel будет использовать для связи SSL:
cat stunnel.key stunnel.cert > stunnel.pem
Создайте файл конфигурации для stunnel с именем dev_https со следующим содержимым:
pid=
cert = stunnel/stunnel.pem
sslVersion = SSLv3
foreground = yes
output = stunnel.log
[https]
accept=8443
connect=8001
TIMEOUTclose=1
Этот файл сообщает stunnel то, что ему нужно знать. В частности, вы говорите ему не использовать файл pid, где находится файл сертификата, какую версию SSL использовать, что он должен работать на переднем плане, где он должен регистрировать свой вывод и что он должен принимать соединение на порту 8443 и переместите их к порту 8001. Последний параметр (TIMEOUTclose) указывает ему автоматически закрыть соединение через 1 секунду бездействия.
Теперь вернитесь в каталог проекта Django (тот, в котором есть manage.py):
cd ..
Здесь мы создадим сценарий с именем runserver, который будет запускать stunnel и два сервера разработки django (один для обычных подключений, а другой для SSL-подключений):
stunnel4 stunnel/dev_https &
python manage.py runserver&
HTTPS=1 python manage.py runserver 8001
Давайте разберем это построчно:
- Строка 1: запускает stunnel и указывает его на только что созданный файл конфигурации. У этого stunnel прослушивает порт 8443, оборачивает любые соединения, которые он получает, в SSL и передает их на порт 8001.
- Строка 2: запускает обычный экземпляр сервера запуска Django (на порту 8000).
- Строка 3: запускает другой экземпляр сервера выполнения Django (на порту 8001) и настраивает его для обработки всех входящих подключений, как если бы они выполнялись с использованием HTTPS.
Сделайте только что созданный файл runscript исполняемым с помощью:
chmod a+x runserver
Теперь, когда вы хотите запустить сервер разработки, просто выполните его ./runserver
из каталога проекта. Чтобы попробовать, просто укажите в браузере http: // localhost: 8000 для обычного HTTP-трафика и https: // localhost: 8443 для HTTPS-трафика. Обратите внимание, что ваш браузер почти наверняка будет жаловаться на используемый сертификат и потребовать от вас добавить исключение или иным образом явно указать браузеру продолжить просмотр. Это потому, что вы создали свой собственный сертификат, и браузер не верит, что он говорит правду о том, кто это. Это хорошо для разработки, но, очевидно, не подойдет для производства.
К сожалению, на моей машине этот сценарий runserver не завершается нормально, когда я нажимаю Ctrl-C. Мне нужно вручную убить процессы - у кого-нибудь есть предложения, как это исправить?
Благодаря Майклу Gilė по почте и Джанго переплетения в запись вики для справочного материала.