Как я могу проверить https-соединения с Django так же легко, как я могу использовать не https-соединения с помощью "runserver"?



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

760   7  

7 ответов:

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

сначала вам понадобится 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 слушать на порту 8443, обернуть любые соединения, которые он получает в SSL, и передать их вместе с портом 8001
  • строка 2: запускает обычный экземпляр Django runserver (на порту 8000)
  • строка 3: запускает другой экземпляр Django runserver (на порту 8001) и настраивает его для обработки всех входящих соединений, как если бы они выполнялись с использованием HTTPS.

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

chmod a+x runserver

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

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

спасибо Майклу Джайлу в должности и Джанго-УИВ запись Вики для справочного материала.

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

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

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

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

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

pip install django-extensions Werkzeug pyOpenSSL

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

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

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

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

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

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

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

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

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

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

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

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

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

sudo pip install django-sslserver

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

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

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

 python manage.py runsslserver 0.0.0.0:8888

Это можно сделать в одной строке с socat:

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

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

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

Comments

    Ничего не найдено.