Как я могу проверить https-соединения с Django так же легко, как я могу использовать не https-соединения с помощью "runserver"?
У меня есть приложение, которое использует "безопасные" куки и хочет проверить его функциональность без необходимости настраивать сложный сервер разработки с поддержкой SSL. Есть ли способ сделать это так просто, как я могу проверить незашифрованные запросы с помощью ./manage.py runserver?
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 443sudo необходимо только для входящих портов (- 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