Ich habe eine Anwendung, die "sichere" Cookies verwendet und deren Funktionalität testen möchte, ohne einen komplizierten SSL-fähigen Entwicklungsserver einrichten zu müssen. Gibt es eine Möglichkeit, dies so einfach zu tun, wie ich unverschlüsselte Anforderungen mit testen kann ./manage.py runserver
?
108
Antworten:
Es ist nicht so einfach wie der eingebaute Entwicklungsserver, aber es ist nicht allzu schwierig, mit stunnel als SSLifying-Vermittler zwischen Ihrem Browser und dem Entwicklungsserver etwas in die Nähe zu bringen. Mit Stunnel können Sie einen kompakten Server auf Ihrem Computer einrichten, der Verbindungen an einem konfigurierten Port akzeptiert, sie mit SSL umschließt und an einen anderen Server weiterleitet. Wir werden dies verwenden, um einen Stunnel-Port (8443) zu öffnen und den empfangenen Datenverkehr an eine Django-Runserver-Instanz weiterzuleiten.
Zuerst benötigen Sie einen Stunnel, der hier heruntergeladen oder vom Paketsystem Ihrer Plattform bereitgestellt werden kann (z
apt-get install stunnel
. B. :) . Ich werde Version 4 von stunnel verwenden (zB:/usr/bin/stunnel4
unter Ubuntu), Version 3 wird ebenfalls funktionieren, hat aber verschiedene Konfigurationsoptionen.Erstellen Sie zunächst ein Verzeichnis in Ihrem Django-Projekt, in dem die erforderlichen Konfigurationsdateien und SSLish-Inhalte gespeichert sind.
Als Nächstes müssen wir ein lokales Zertifikat und einen Schlüssel erstellen, die für die SSL-Kommunikation verwendet werden sollen. Dazu wenden wir uns an openssl.
Erstellen Sie den Schlüssel:
Erstellen Sie das Zertifikat, das diesen Schlüssel verwendet (hier werden Sie nach einer Reihe von Informationen gefragt, die im Zertifikat enthalten sind - antworten Sie einfach mit dem, was sich für Sie gut anfühlt):
Kombinieren Sie diese nun zu einer einzigen Datei, die stunnel für die SSL-Kommunikation verwendet:
Erstellen Sie eine Konfigurationsdatei für stunnel mit dem Namen dev_https mit den folgenden Inhalten:
Diese Datei sagt stunnel, was es wissen muss. Insbesondere weisen Sie es an, keine PID-Datei zu verwenden, in der sich die Zertifikatdatei befindet, welche SSL-Version verwendet werden soll, die im Vordergrund ausgeführt werden soll, in der die Ausgabe protokolliert werden soll und die Verbindung am Port akzeptiert werden soll 8443 und bringen Sie sie zu Port 8001. Der letzte Parameter (TIMEOUTclose) weist ihn an, die Verbindung automatisch zu schließen, nachdem 1 Sekunde ohne Aktivität vergangen ist.
Kehren Sie nun zu Ihrem Django-Projektverzeichnis zurück (das mit der Datei "manage.py"):
Hier erstellen wir ein Skript namens runserver, auf dem stunnel und zwei Django-Entwicklungsserver ausgeführt werden (einer für normale Verbindungen und einer für SSL-Verbindungen):
Lassen Sie uns dies Zeile für Zeile aufschlüsseln:
Machen Sie die gerade erstellte Runscript-Datei ausführbar mit:
Wenn Sie jetzt Ihren Entwicklungsserver ausführen möchten, führen Sie ihn einfach
./runserver
aus Ihrem Projektverzeichnis aus. Zeigen Sie zum Ausprobieren einfach Ihren Browser auf http: // localhost: 8000 für normalen HTTP-Verkehr und https: // localhost: 8443 für HTTPS-Verkehr. Beachten Sie, dass sich Ihr Browser mit ziemlicher Sicherheit über das verwendete Zertifikat beschwert und Sie dazu auffordert, eine Ausnahme hinzuzufügen oder den Browser anderweitig ausdrücklich anzuweisen, mit dem Surfen fortzufahren. Dies liegt daran, dass Sie Ihr eigenes Zertifikat erstellt haben und der Browser nicht darauf vertraut, dass er die Wahrheit darüber sagt, wer es ist. Dies ist gut für die Entwicklung, wird es aber offensichtlich nicht für die Produktion schneiden.Leider wird dieses Runserver-Skript auf meinem Computer nicht gut beendet, wenn ich Strg-C drücke. Ich muss die Prozesse manuell beenden - hat jemand einen Vorschlag, um das zu beheben?
Vielen Dank an Michael Giles Beitrag und den Wiki-Eintrag von Django-Weave für das Referenzmaterial.
quelle
request.is_secure()
gemeldet wirdTrue
. Wenn Sie das nicht brauchen, haben Sie Recht - Sie können den Tunnel einfach auf die einzelne Instanz richten."sslVersion = SSLv3": SSLv3 not supported
.stunnel_pid=$1
hat bei mir nicht funktioniert, aberstunnel_pid=$!
funktioniert. Wie hatstunnel_pid=$1
bei dir gearbeitet?Ich würde empfehlen, das Paket django-sslserver zu verwenden .
Das aktuelle Paket auf PyPI unterstützt nur bis zu Django Version 1.5.5, aber ein Patch wurde über 5d4664c festgeschrieben . Mit diesem Fix läuft das System gut und ist eine ziemlich einfache und unkomplizierte Lösung zum Testen von https-Verbindungen.
UPDATE: Da ich meine Antwort gepostet commit oben wurde verschmolzen in den Hauptzweig und ein neues Release hat PyPI geschoben worden. Es sollte also nicht erforderlich sein, das 5d4664c-Commit für diesen bestimmten Fix anzugeben.
quelle
Ähnlich wie bei django-sslserver können Sie RunServerPlus von django-extensions verwenden
Es hat Abhängigkeiten von Werkzeug (damit Sie Zugriff auf den hervorragenden Werkzeug-Debugger erhalten) und pyOpenSSL (nur für den SSL-Modus erforderlich), um Folgendes zu installieren:
Fügen Sie es INSTALLED_APPS in der Datei settings.py Ihres Projekts hinzu:
Dann können Sie den Server im SSL-Modus ausführen mit:
Dadurch werden eine Zertifizierungsdatei
/tmp/cert.crt
und eine Schlüsseldatei erstellt,/tmp/cert.key
die dann für zukünftige Sitzungen wiederverwendet werden können.In Django-Erweiterungen sind einige zusätzliche Dinge enthalten, die Sie möglicherweise verwenden können. Es lohnt sich also, einen kurzen Blick durch die Dokumente zu werfen.
quelle
./manage.py runserver_plus --cert /tmp/cert 0.0.0.0:8000
einfach installieren
sslserver in installierte aps einbinden
Jetzt kannst du rennen
quelle
Melden Sie sich bei https://ngrok.com/ an . Sie können https zum Testen verwenden. Dies kann Menschen helfen, die nur schnell https testen möchten.
quelle
Für diejenigen, die nach einer Vordergrundversion der Stunnel-Option für Debugging-Zwecke suchen:
stunnel.pem ist ein Zertifikat, das wie in Evan Grimms bestbewerteter Antwort generiert wurde.
Lauschen Sie allen lokalen Schnittstellen an Port 443 und leiten Sie sie an Port 80 von localhost weiter
sudo ist nur für eingehende Ports (-d [host:] port) unter 1024 erforderlich
quelle
Geben Sie den folgenden Befehl am Terminal aus
Es wird die ngrok-Sitzung gestartet. Es werden zwei URLs aufgelistet. Einer ist http: // localhost: 8000 zugeordnet . Der zweite ist https: // localhost: 8000 zugeordnet . Bitte überprüfen Sie den Screenshot unten. Verwenden Sie eine der beiden URLs. Es wird Ihrem lokalen Server zugeordnet.
quelle
allowed_host
Dies kann in einer Zeile mit socat erfolgen:
server.pem ist ein selbstsigniertes Serverzertifikat und localhost: 8000 ist ein Debug-HTTP-Server, der wie gewohnt gestartet wird.
Weitere Details: http://www.dest-unreach.org/socat/doc/socat-openssltunnel.html
quelle
Behandeln Sie SSL / TLS mit einem Proxy wie Nginx anstelle von Django. Nginx kann so eingerichtet werden, dass es Port 443 überwacht und Anforderungen (normalerweise
http://127.0.0.1:8000
) an Ihren Django-Entwicklungsserver weiterleitet . Eine Nginx-Konfiguration hierfür könnte folgendermaßen aussehen:Sie werden auch eine Karte brauchen ,
django-dev.localhost
um127.0.0.1
hinzuzufügen ,django-dev.localhost
umALLOWED_HOSTS
insettings.py
. Unter Linux müssen Sie die folgende Zeile hinzufügen/etc/hosts
:Sie können dann Ihre Entwickler-Site erreichen, indem Sie
https://django-dev.localhost
in Ihrem Browser aufrufen (Sie müssen die Sicherheitswarnung Ihres Browsers umgehen).quelle