J'ai une application qui utilise des cookies «sécurisés» et je souhaite tester ses fonctionnalités sans avoir à configurer un serveur de développement SSL complexe. Existe-t-il un moyen de le faire aussi simplement que je peux tester les demandes non chiffrées en utilisant ./manage.py runserver
?
109
Réponses:
Ce n'est pas aussi simple que le serveur de développement intégré, mais il n'est pas trop difficile d'obtenir quelque chose de proche en utilisant stunnel comme intermédiaire SSLifying entre votre navigateur et le serveur de développement. Stunnel vous permet de configurer un serveur léger sur votre machine qui accepte les connexions sur un port configuré, les enveloppe avec SSL et les transmet à un autre serveur. Nous allons l'utiliser pour ouvrir un port stunnel (8443) et transmettre tout trafic qu'il reçoit à une instance de Django runserver.
Vous aurez d'abord besoin de stunnel qui peut être téléchargé ici ou peut être fourni par le système de paquets de votre plate-forme (par exemple :)
apt-get install stunnel
. J'utiliserai la version 4 de stunnel (par exemple:/usr/bin/stunnel4
sur Ubuntu), la version 3 fonctionnera également, mais a différentes options de configuration.Créez d'abord un répertoire dans votre projet Django pour contenir les fichiers de configuration nécessaires et les éléments SSLish.
Ensuite, nous devrons créer un certificat local et une clé à utiliser pour la communication SSL. Pour cela, nous nous tournons vers openssl.
Créez la clé:
Créez le certificat qui utilise cette clé (cela vous demandera un tas d'informations qui seront incluses dans le certificat - répondez simplement avec ce qui vous convient):
Maintenant, combinez-les en un seul fichier que stunnel utilisera pour sa communication SSL:
Créez un fichier de configuration pour stunnel appelé dev_https avec le contenu suivant:
Ce fichier indique à Stunnel ce qu'il doit savoir. Plus précisément, vous lui dites de ne pas utiliser de fichier pid, où se trouve le fichier de certificat, quelle version de SSL utiliser, qu'il doit s'exécuter au premier plan, où il doit enregistrer sa sortie et qu'il doit accepter la connexion sur le port 8443 et les acheminer vers le port 8001. Le dernier paramètre (TIMEOUTclose) lui dit de fermer automatiquement la connexion après 1 seconde sans activité.
Maintenant, revenez dans le répertoire de votre projet Django (celui avec manage.py):
Ici, nous allons créer un script nommé runserver qui exécutera stunnel et deux serveurs de développement django (un pour les connexions normales et un pour les connexions SSL):
Décomposons ceci, ligne par ligne:
Rendez le fichier runscript que nous venons de créer exécutable avec:
Maintenant, lorsque vous souhaitez exécuter votre serveur de développement, exécutez simplement à
./runserver
partir du répertoire de votre projet. Pour l'essayer, pointez simplement votre navigateur sur http: // localhost: 8000 pour le trafic HTTP normal et https: // localhost: 8443 pour le trafic HTTPS. Notez que votre navigateur se plaindra presque certainement du certificat utilisé et vous demandera d'ajouter une exception ou de demander explicitement au navigateur de continuer à naviguer. En effet, vous avez créé votre propre certificat et le navigateur ne lui fait pas confiance pour dire la vérité sur qui il s'agit. C'est bien pour le développement, mais évidemment pas pour la production.Malheureusement, sur ma machine, ce script runserver ne se termine pas correctement lorsque j'appuie sur Ctrl-C. Je dois tuer manuellement les processus - quelqu'un a-t-il une suggestion pour résoudre ce problème?
Merci au post de Michael Gile et à l' entrée wiki de django-weave pour le matériel de référence.
la source
request.is_secure()
le rapport sera signaléTrue
. Si vous n'en avez pas besoin, vous avez raison - vous pouvez simplement pointer Stunnel sur l'instance unique."sslVersion = SSLv3": SSLv3 not supported
.stunnel_pid=$1
n'a pas fonctionné pour moi mais l'astunnel_pid=$!
fait. Comment ça astunnel_pid=$1
marché pour vous?Je recommanderais d'utiliser le package django-sslserver .
Le package actuel sur PyPI ne prend en charge que la version 1.5.5 de Django mais un correctif a été commis via 5d4664c . Avec ce correctif, le système fonctionne bien et constitue une solution assez simple et directe pour tester les connexions https.
MISE À JOUR: Depuis que j'ai publié ma réponse, le commit ci-dessus a été fusionné dans la branche principale et une nouvelle version a été envoyée à PyPI. Il ne devrait donc pas être nécessaire de spécifier le commit 5d4664c pour ce correctif spécifique.
la source
Similaire à django-sslserver, vous pouvez utiliser RunServerPlus à partir de django-extensions
Il a des dépendances sur Werkzeug (vous avez donc accès à l'excellent débogueur Werkzeug) et pyOpenSSL (requis uniquement pour le mode ssl), donc pour installer, exécutez:
Ajoutez-le à INSTALLED_APPS dans le fichier settings.py de votre projet:
Ensuite, vous pouvez exécuter le serveur en mode ssl avec:
Cela créera un fichier de certificat sur
/tmp/cert.crt
et un fichier de clé sur/tmp/cert.key
lequel pourra être réutilisé pour de futures sessions.Il y a un tas de trucs supplémentaires inclus dans les extensions django que vous pouvez trouver utiles, il vaut donc la peine de parcourir rapidement la documentation.
la source
./manage.py runserver_plus --cert /tmp/cert 0.0.0.0:8000
installe juste
inclure sslserver dans les aps installés
maintenant tu peux courir
la source
Inscrivez-vous sur https://ngrok.com/ . Vous pouvez utiliser https pour tester. Cela peut aider les personnes qui souhaitent simplement tester rapidement https.
la source
Pour ceux qui recherchent une version au premier plan de l'option stunnel à des fins de débogage:
stunnel.pem est un certificat généré comme dans la réponse la plus votée d'Evan Grimm.
Écouter sur toutes les interfaces locales sur le port 443 et transférer vers le port 80 sur localhost
sudo n'est nécessaire que pour les ports entrants (-d [hôte:] port) sous 1024
la source
Émettre la commande suivante sur le terminal
Il démarrera la session ngrok. Il listera deux URL. L'un est mappé sur http: // localhost: 8000 . Le second est mappé sur https: // localhost: 8000 . Veuillez vérifier la capture d'écran ci-dessous. Utilisez l'une ou l'autre des URL. Il sera mappé à votre serveur local.
la source
allowed_host
Cela peut être fait en une seule ligne avec socat:
, où 8443 est un port pour écouter les connexions HTTPS entrantes, server.pem est un certificat de serveur auto-signé et localhost: 8000 est un serveur HTTP de débogage lancé comme d'habitude.
Plus de détails: http://www.dest-unreach.org/socat/doc/socat-openssltunnel.html
la source
Gérez SSL / TLS avec un proxy tel que Nginx plutôt que Django. Nginx peut être configuré pour écouter sur le port 443, puis transférer les requêtes vers votre serveur de développement Django (généralement
http://127.0.0.1:8000
). Une configuration Nginx pour cela pourrait ressembler à ce qui suit:Vous aurez également besoin de carte
django-dev.localhost
pour127.0.0.1
et ajouterdjango-dev.localhost
àALLOWED_HOSTS
danssettings.py
. Sous Linux, vous devrez ajouter la ligne suivante à/etc/hosts
:Vous pourrez ensuite accéder à votre site de développement en accédant à
https://django-dev.localhost
votre navigateur (vous devrez contourner l'avertissement de sécurité de votre navigateur).la source