Comment puis-je tester les connexions https avec Django aussi facilement que possible avec des connexions non-https utilisant ‘runserver’?

J’ai une application qui utilise des cookies “sécurisés” et souhaite tester ses fonctionnalités sans avoir à configurer un serveur de développement compliqué compatible SSL. Y a-t-il un moyen de le faire aussi simplement que je peux tester des requêtes non chiffrées en utilisant ./manage.py runserver ?

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 SSLifiant 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 l’utiliserons pour ouvrir un port stunnel (8443) et transmettre le trafic reçu à une instance de serveur d’exécution Django.

D’abord, vous aurez besoin de stunnel qui peut être téléchargé ici ou peut être fourni par le système de paquet de votre plate-forme (par exemple: apt-get install stunnel ). Je vais utiliser la version 4 de stunnel (par exemple: /usr/bin/stunnel4 sur Ubuntu), la version 3 fonctionnera également, mais aura des options de configuration différentes.

Commencez par créer un répertoire dans votre projet Django pour contenir les fichiers de configuration et les éléments SSLish nécessaires.

 mkdir stunnel cd stunnel 

Ensuite, nous devrons créer un certificate et une clé locaux à utiliser pour la communication SSL. Pour cela, nous nous tournons vers openssl.

Créez la clé:

 openssl genrsa 1024 > stunnel.key 

Créez le certificate qui utilise cette clé (cela vous demandera un tas d’informations qui seront incluses dans le certificate – répondez simplement à ce qui vous convient le mieux):

 openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert 

Maintenant, combinez-les en un seul fichier que stunnel utilisera pour sa communication SSL:

 cat stunnel.key stunnel.cert > stunnel.pem 

Créez un fichier de configuration pour stunnel appelé dev_https avec le contenu suivant:

 pid= cert = stunnel/stunnel.pem sslVersion = SSLv3 foreground = yes output = stunnel.log [https] accept=8443 connect=8001 TIMEOUTclose=1 

Ce fichier indique à stunnel ce qu’il doit savoir. Plus précisément, vous lui dites de ne pas utiliser de fichier pid, où le fichier de certificate est, quelle version de SSL utiliser, qu’il doit exécuter au premier plan, où il doit enregistrer sa sortie et accepter la connexion sur le port. 8443 et transférez-les vers le port 8001. Le dernier paramètre (TIMEOUTclose) lui indique de fermer automatiquement la connexion après une seconde sans activité.

Revenez maintenant à votre répertoire de projet Django (celui qui contient manage.py):

 cd .. 

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):

 stunnel4 stunnel/dev_https & python manage.py runserver& HTTPS=1 python manage.py runserver 8001 

Disons ceci, ligne par ligne:

  • Ligne 1: démarre stunnel et pointez-le sur le fichier de configuration que nous venons de créer. Stunnel écoute sur le port 8443, encapsule toutes les connexions qu’il reçoit dans SSL et les transmet au port 8001
  • Ligne 2: démarre une instance de serveur d’exécution Django normale (sur le port 8000)
  • Ligne 3: Démarre une autre instance de serveur d’exécution Django (sur le port 8001) et la configure pour traiter toutes les connexions entrantes comme si elles étaient effectuées à l’aide de HTTPS.

Créez le fichier exécutable que nous venons de créer avec:

 chmod a+x runserver 

Maintenant, lorsque vous souhaitez exécuter votre serveur de développement, exécutez simplement ./runserver partir de votre répertoire de 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 certificate utilisé et vous demandera d’append une exception ou de demander explicitement au navigateur de continuer à naviguer. Cela est dû au fait que vous avez créé votre propre certificate et le navigateur n’a pas confiance en lui pour dire la vérité. C’est bon pour le développement, mais évidemment, il ne sera pas réduit pour la production.

Malheureusement, sur ma machine, ce script runserver ne sort pas bien lorsque j’appuie sur Ctrl-C. Je dois tuer manuellement les processus – quelqu’un a 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.

Je recommande d’utiliser le package django-sslserver .

Le paquet actuel sur PyPI ne supporte que Django version 1.5.5 mais un correctif a été validé via 5d4664c . Avec ce correctif, le système fonctionne bien et constitue une solution simple et directe pour tester les connexions https.

MISE À JOUR: Depuis que j’ai posté ma réponse, la validation ci-dessus a été fusionnée dans la twig principale et une nouvelle version a été envoyée à PyPI. Il ne devrait donc pas être nécessaire de spécifier la validation 5d4664c pour ce correctif spécifique.

Semblable à django-sslserver, vous pouvez utiliser RunServerPlus à partir de django-extensions

Il a des dépendances sur Werkzeug (vous avez donc access à l’excellent débogueur de Werkzeug) et pyOpenSSL (uniquement requirejs pour le mode ssl) pour pouvoir installer le programme:

 pip install django-extensions Werkzeug pyOpenSSL 

Ajoutez-le à INSTALLED_APPS dans votre fichier settings.py de projets:

 INSTALLED_APPS = ( ... 'django_extensions', ... ) 

Ensuite, vous pouvez exécuter le serveur en mode SSL avec:

 ./manage.py runserver_plus --cert /tmp/cert 

Cela créera un fichier de cert dans /tmp/cert.crt et un fichier de clé dans /tmp/cert.key qui pourra ensuite être réutilisé pour les sessions futures.

Il y a un tas de choses supplémentaires incluses dans django-extensions que vous pouvez trouver utiles, donc ça vaut le coup de parcourir rapidement les documents.

Inscrivez-vous sur https://ngrok.com/ . Vous pouvez utiliser https pour tester. Cela pourrait aider les personnes qui veulent simplement tester rapidement https.

Pour ceux qui recherchent une version avancée de l’option stunnel à des fins de débogage:

stunnel.pem est un certificate généré comme dans la réponse votée par Evan Grimm.

Écouter sur toutes les interfaces locales sur le port 443 et transférer sur le port 80 sur localhost

 sudo stunnel -f -p stunnel.pem -P ~/stunnel.pid -r localhost:80 -d 443 

sudo n’est nécessaire que pour les ports entrants (-d [hôte:] port) sous 1024

installer juste

 sudo pip install django-sslserver 

inclure sslserver dans les aps installées

 INSTALLED_APPS = (... "sslserver", ... ) 

maintenant tu peux courir

  python manage.py runsslserver 0.0.0.0:8888 

Cela peut se faire en une seule ligne avec socat:

 socat openssl-listen:8443,fork,reuseaddr,cert=server.pem,verify=0 tcp:localhost:8000 

, où 8443 est un port pour écouter les connexions HTTPS entrantes, server.pem est un certificate 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