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.
mkdir stunnel
cd stunnel
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:
openssl genrsa 1024 > stunnel.key
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):
openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert
Teraz połącz je w jeden plik, którego stunnel będzie używał do komunikacji SSL:
cat stunnel.key stunnel.cert > stunnel.pem
Utwórz plik konfiguracyjny dla stunnel o nazwie dev_https z następującą zawartością:
pid=
cert = stunnel/stunnel.pem
sslVersion = SSLv3
foreground = yes
output = stunnel.log
[https]
accept=8443
connect=8001
TIMEOUTclose=1
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):
cd ..
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):
stunnel4 stunnel/dev_https &
python manage.py runserver&
HTTPS=1 python manage.py runserver 8001
Podzielmy to, linia po linii:
- Linia 1: uruchamia stunnel i wskazuje plik konfiguracyjny, który właśnie utworzyliśmy. To nasłuchuje stunnel na porcie 8443, zawija wszystkie otrzymywane połączenia w SSL i przekazuje je dalej do portu 8001
- Wiersz 2: Uruchamia zwykłą instancję uruchomieniową Django (na porcie 8000)
- Linia 3: Uruchamia kolejną instancję serwera uruchomieniowego Django (na porcie 8001) i konfiguruje ją tak, aby traktować wszystkie połączenia przychodzące tak, jakby były wykonywane przy użyciu HTTPS.
Spraw, aby utworzony plik Runcript był wykonywalny za pomocą:
chmod a+x runserver
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.