Mam aplikację korzystającą z „bezpiecznych” plików cookie i chcę przetestować jej funkcjonalność bez konieczności konfigurowania skomplikowanego serwera programistycznego obsługującego protokół SSL. Czy istnieje sposób, aby to zrobić tak prosto, jak mogę przetestować niezaszyfrowane żądania za pomocą ./manage.py runserver
?
109
Odpowiedzi:
To nie jest tak proste, jak wbudowany serwer deweloperski, ale nie jest zbyt trudno uzyskać coś bliskiego za pomocą stunnel jako pośrednika SSL między przeglądarką a serwerem programistycznym. Stunnel umożliwia skonfigurowanie na komputerze lekkiego serwera, który akceptuje połączenia na skonfigurowanym porcie, otacza je SSL i przekazuje je do innego serwera. Użyjemy tego do otwarcia portu stunnel (8443) i przekażemy cały ruch, który otrzyma do instancji serwera uruchomieniowego Django.
Najpierw będziesz potrzebować stunnela, który można pobrać tutaj lub może być dostarczony przez system pakietów Twojej platformy (np
apt-get install stunnel
.:). Będę używał wersji 4 stunnel (np./usr/bin/stunnel4
Na Ubuntu), wersja 3 też będzie działać, ale ma inne opcje konfiguracji.Najpierw utwórz katalog w swoim projekcie Django, aby przechowywać niezbędne pliki konfiguracyjne i elementy SSL.
Następnie musimy utworzyć lokalny certyfikat i klucz, który będzie używany do komunikacji SSL. W tym celu zwracamy się do openssl.
Utwórz klucz:
Utwórz certyfikat, który używa tego klucza (poprosi Cię to o kilka informacji, które zostaną zawarte w certyfikacie - po prostu odpowiedz, podając to, co Ci odpowiada):
Teraz połącz je w jeden plik, którego stunnel będzie używał do komunikacji SSL:
Utwórz plik konfiguracyjny dla stunnel o nazwie dev_https z następującą zawartością:
Ten plik mówi stunnelowi, co powinien wiedzieć. Mówiąc konkretnie, mówisz mu, aby nie używał pliku pid, gdzie znajduje się plik certyfikatu, jakiej wersji SSL użyć, że powinien działać na pierwszym planie, gdzie powinien rejestrować swoje dane wyjściowe i że powinien akceptować połączenie na porcie 8443 i prześlij je do portu 8001. Ostatni parametr (TIMEOUTclose) nakazuje mu automatyczne zamknięcie połączenia po upływie 1 sekundy bez aktywności.
Teraz wyskakuj z powrotem do katalogu projektu Django (tego z manage.py):
Tutaj utworzymy skrypt o nazwie runerver, który będzie uruchamiał stunnel i dwa serwery programistyczne django (jeden dla normalnych połączeń, a drugi dla połączeń SSL):
Podzielmy to, linia po linii:
Spraw, aby utworzony plik Runcript był wykonywalny za pomocą:
Teraz, gdy chcesz uruchomić serwer deweloperski, po prostu wykonaj
./runserver
z katalogu projektu. Aby to wypróbować, po prostu skieruj swoją przeglądarkę na http: // localhost: 8000 dla normalnego ruchu HTTP i https: // localhost: 8443 dla ruchu HTTPS. Zauważ, że Twoja przeglądarka prawie na pewno będzie narzekać na używany certyfikat i wymagać dodania wyjątku lub w inny sposób wyraźnie poinstruuj przeglądarkę, aby kontynuowała przeglądanie. Dzieje się tak, ponieważ utworzyłeś swój własny certyfikat i przeglądarka nie ufa, że mówi prawdę o tym, kto to jest. Jest to dobre do programowania, ale oczywiście nie nadaje się do produkcji.Niestety, na mojej maszynie ten skrypt uruchomieniowy nie wychodzi dobrze po naciśnięciu Ctrl-C. Muszę ręcznie zabić procesy - ktoś ma sugestię, jak to naprawić?
Podziękowania dla posta Michaela Gile'a i wpisu wiki django-weave za materiał referencyjny.
źródło
request.is_secure()
będzie raportowaćTrue
. Jeśli tego nie potrzebujesz, masz rację - możesz po prostu skierować stunnel na jedną instancję."sslVersion = SSLv3": SSLv3 not supported
.stunnel_pid=$1
nie pracował dla mnie, alestunnel_pid=$!
tak. Jak ci się udałostunnel_pid=$1
?Polecam użycie pakietu django-sslserver .
Obecny pakiet na PyPI obsługuje tylko do wersji Django 1.5.5, ale poprawka została zatwierdzona przez 5d4664c . Dzięki tej poprawce system działa dobrze i jest dość prostym i prostym rozwiązaniem do testowania połączeń https.
AKTUALIZACJA: Odkąd opublikowałem moją odpowiedź, powyższe zatwierdzenie zostało włączone do gałęzi master, a nowe wydanie zostało przesłane do PyPI. Więc nie powinno być potrzeby określania zatwierdzenia 5d4664c dla tej konkretnej poprawki.
źródło
Podobnie jak django-sslserver, możesz użyć RunServerPlus z django-extensions
Ma zależności od Werkzeug (więc masz dostęp do doskonałego debuggera Werkzeug) i pyOpenSSL (wymagane tylko w trybie ssl), więc aby zainstalować uruchom:
Dodaj go do INSTALLED_APPS w pliku settings.py projektów:
Następnie możesz uruchomić serwer w trybie ssl za pomocą:
Spowoduje to utworzenie pliku certyfikatów pod adresem
/tmp/cert.crt
i pliku klucza, w/tmp/cert.key
którym można będzie ponownie użyć go w przyszłych sesjach.Jest kilka dodatkowych rzeczy zawartych w rozszerzeniach django, które mogą okazać się przydatne, dlatego warto szybko przejrzeć dokumentację.
źródło
./manage.py runserver_plus --cert /tmp/cert 0.0.0.0:8000
po prostu zainstaluj
dołącz serwer ssl do zainstalowanych aps
teraz możesz biec
źródło
Zarejestruj się na https://ngrok.com/ . Możesz użyć https do testowania. Może to pomóc osobom, które chcą po prostu szybko przetestować https.
źródło
Dla tych, którzy szukają pierwszoplanowej wersji opcji stunnel do celów debugowania:
stunnel.pem to certyfikat wygenerowany zgodnie z najczęściej głosowaną odpowiedzią Evana Grimma.
Nasłuchuj na wszystkich interfejsach lokalnych na porcie 443 i przekierowuj na port 80 na hoście lokalnym
sudo jest konieczne tylko dla portów przychodzących (-d [host:] port) poniżej 1024
źródło
Wydaj następujące polecenie na terminalu
Rozpocznie się sesja ngrok. Wyświetli dwa adresy URL. Jeden jest odwzorowany na http: // localhost: 8000 . Drugi jest mapowany na https: // localhost: 8000 . Sprawdź poniższy zrzut ekranu. Użyj dowolnego adresu URL. Zostanie zmapowany na twój lokalny serwer.
źródło
allowed_host
Można to zrobić w jednej linii z socat:
, gdzie 8443 to port do nasłuchiwania przychodzących połączeń HTTPS, server.pem to samopodpisany certyfikat serwera, a localhost: 8000 to debugujący serwer HTTP uruchamiany jak zwykle.
Więcej szczegółów: http://www.dest-unreach.org/socat/doc/socat-openssltunnel.html
źródło
Obsługuj SSL / TLS za pomocą serwera proxy, takiego jak Nginx, a nie Django. Nginx można skonfigurować tak, aby nasłuchiwał na porcie 443, a następnie przekazywał żądania do serwera deweloperskiego Django (zazwyczaj
http://127.0.0.1:8000
). Konfiguracja Nginx do tego może wyglądać następująco:Musisz również mapować
django-dev.localhost
do127.0.0.1
i dodaćdjango-dev.localhost
doALLOWED_HOSTS
wsettings.py
. W systemie Linux musisz dodać następujący wiersz do/etc/hosts
:Będziesz wtedy mógł przejść do swojej witryny deweloperskiej, przechodząc do
https://django-dev.localhost
przeglądarki (będziesz musiał ominąć ostrzeżenie o zabezpieczeniach przeglądarki).źródło