Как я могу проверить соединения https с Django так же легко, как и соединения не https, используя 'runserver'? - PullRequest
90 голосов
/ 06 ноября 2011

У меня есть приложение, которое использует «безопасные» куки-файлы и хочет проверить их функциональность без необходимости настройки сложного сервера разработки с поддержкой SSL. Есть ли способ сделать это так же просто, как я могу проверить незашифрованные запросы, используя ./manage.py runserver?

Ответы [ 7 ]

103 голосов
/ 06 ноября 2011

Это не , а просто, как встроенный сервер разработки, но не так уж сложно найти что-то близкое, используя stunnel в качестве посредника SSLifying между вашим браузером и сервером разработки. Stunnel позволяет вам настроить облегченный сервер на вашем компьютере, который принимает соединения через настроенный порт, оборачивает их с помощью SSL и передает их на какой-либо другой сервер. Мы будем использовать это, чтобы открыть порт stunnel (8443) и передать любой трафик, который он получает, к экземпляру сервера выполнения Django.

Сначала вам понадобится stunnel, который можно загрузить здесь или который может быть предоставлен системой пакетов вашей платформы (например: apt-get install stunnel). Я буду использовать версию 4 Stunnel (например, /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 listen для порта 8443, оберните все соединения, которые он получает в SSL, и передайте их через порт 8001
  • Строка 2: запуск обычного экземпляра сервера запуска Django (на порту 8000)
  • Строка 3: запускает другой экземпляр сервера запуска Django (на порту 8001) и настраивает его так, чтобы он обрабатывал все входящие подключения, как если бы они выполнялись с использованием HTTPS.

Сделать исполняемый файл, с которым мы только что создали, исполняемым:

chmod a+x runserver

Теперь, когда вы хотите запустить сервер разработки, просто выполните ./runserver из каталога вашего проекта. Чтобы проверить это, просто укажите в своем браузере http://localhost:8000 для обычного HTTP-трафика и https://localhost:8443 для HTTPS-трафика. Обратите внимание, что ваш браузер почти наверняка будет жаловаться на используемый сертификат и потребует, чтобы вы добавили исключение или иным образом явно указали браузеру продолжить просмотр. Это потому, что вы создали свой собственный сертификат, и браузер не может сказать правду о том, кто он. Это хорошо для разработки, но, очевидно, не подойдет для производства.

К сожалению, на моем компьютере этот скрипт сервера запуска не выходит из строя, когда я нажимаю Ctrl-C. Я должен вручную убить процессы - у кого-нибудь есть предложение, чтобы это исправить?

Спасибо посту Майкла Джайла и вики-записи django-weave за справочный материал.

73 голосов
/ 08 декабря 2013

Я бы порекомендовал использовать пакет django-sslserver .

Текущий пакет на PyPI поддерживает только до версии Django 1.5.5, но патч был зафиксирован через 5d4664c . Благодаря этому исправлению система работает хорошо и представляет собой довольно простое и понятное решение для проверки соединений https.

UPDATE: С тех пор, как я опубликовал свой ответ, вышеприведенный коммит был объединен в основную ветку, а новый релиз перенесен в PyPI. Поэтому не нужно указывать фиксацию 5d4664c для этого конкретного исправления.

53 голосов
/ 09 марта 2015

Подобно django-sslserver вы можете использовать RunServerPlus из django-extensions

У него есть зависимости от Werkzeug (так что вы получаете доступ к превосходному отладчику Werkzeug)и pyOpenSSL (требуется только для режима ssl), поэтому для установки выполните:

pip install django-extensions Werkzeug pyOpenSSL

Добавьте его в INSTALLED_APPS в файле settings.py вашего проекта:

INSTALLED_APPS = (
    ...
    'django_extensions',
    ...
)

Затем вы можете запустить серверв режиме ssl с:

./manage.py runserver_plus --cert /tmp/cert

Это создаст файл сертификата на /tmp/cert.crt и файл ключа на /tmp/cert.key, который затем можно будет использовать для будущих сессий.

Существуеткуча дополнительных вещей, включенных в расширения django, которые вы можете найти полезными, поэтому стоит быстро пролистать документы.

13 голосов
/ 17 июля 2018

просто установите

sudo pip install django-sslserver

включите sslserver в установленные aps

INSTALLED_APPS = (...
"sslserver",
...
)

теперь вы можете запустить

 python manage.py runsslserver 0.0.0.0:8888
12 голосов
/ 05 сентября 2013

Регистрация на https://ngrok.com/. Вы можете использовать https для тестирования.Это может помочь людям, которые просто хотят быстро проверить https.

4 голосов
/ 24 марта 2014

Для тех, кто ищет предварительную версию опции stunnel для целей отладки:

stunnel.pem - это сертификат, сгенерированный так, как в ответе Эвана Гримма.

Прослушивание всех локальных интерфейсов на порту 443 и переадресация на порт 80 на локальном хосте

sudo stunnel -f -p stunnel.pem -P ~/stunnel.pid -r localhost:80 -d 443

sudo требуется только для входящих портов (-d [host:] port) под 1024

1 голос
/ 28 апреля 2013

Это можно сделать в одну строку с помощью socat:

socat openssl-listen:8443,fork,reuseaddr,cert=server.pem,verify=0 tcp:localhost:8000

, где 8443 - это порт для прослушивания входящих HTTPS-соединений, server.pem - это самозаверяющий сертификат сервера, а localhost: 8000 - отладочный HTTP-сервер, запускаемый как обычно.

Подробнее: http://www.dest -unreach.org / socat / doc / socat-openssltunnel.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...