93 votes

Comment puis-je tester les connexions https avec Django aussi facilement que les connexions non-https en utilisant 'runserver'?

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 compliqué compatible SSL. Y a-t-il un moyen de le faire aussi simplement que je peux tester des demandes non chiffrées en utilisant ./manage.py runserver ?

105voto

Evan Grim Points 1318

Ce n'est pas aussi simple que le construit dans le serveur de développement, mais il n'est pas trop difficile d'obtenir quelque chose de proche à l'aide de stunnel comme un SSLifying intermédiaire entre votre navigateur et le serveur de développement. Stunnel vous permet de configurer un léger serveur sur votre machine qui accepte des connexions sur un port configuré, les enveloppe avec SSL, et les transmet à un autre serveur. Nous allons nous en servir pour ouvrir une stunnel (port 8443) et passer le long de tout le trafic qu'il reçoit pour un Django runserver instance.

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

D'abord créer un répertoire dans votre projet Django pour contenir le nécessaire fichiers de configuration et SSLish choses.

mkdir stunnel
cd stunnel

Ensuite, nous aurons besoin de créer un local de certificat et de clé à utiliser pour la communication SSL. Pour cela, nous nous tournons vers openssl.

Créer la clé:

openssl genrsa 1024 > stunnel.key

Créer le certificat qui utilise cette clé (cela va vous poser un tas d'informations qui seront incluses dans le certficate - il suffit de répondre avec tout ce qui se sent bien à vous):

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

Maintenant les combiner en un seul fichier que stunnel va utiliser pour sa communication SSL:

cat stunnel.key stunnel.cert > stunnel.pem

Créer un fichier de config 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 êtes lui disant de ne pas utiliser un fichier pid, où le fichier de certificat est, quelle est la version de SSL à utiliser, qu'il doit exécuter dans le premier plan, où il doit enregistrer sa sortie, et qu'il doit accepter les connexions sur le port 8443 et de la navette le long de port 8001. Le dernier paramètre (TIMEOUTclose) lui dit de fermer automatiquement la connexion après 1 seconde, a passé avec plus d'activité.

Maintenant, la pop de retour jusqu'à votre projet Django répertoire (celui avec manage.py dans celui-ci):

cd ..

Ici, nous allons créer un script nommé runserver qui sera exécuté stunnel et deux django serveurs de développement (l'un pour les connexions normales, et l'autre pour les connexions SSL):

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

Décomposons le bas, ligne par ligne:

  • Ligne 1: Commence stunnel et qu'il pointe vers le fichier de configuration que nous venons de créer. Cela a stunnel écouter sur le port 8443, enveloppez toutes les connexions qu'il reçoit en SSL, et de les transmettre à port 8001
  • Ligne 2: Commence normale Django runserver exemple (sur le port 8000)
  • Ligne 3: Commence une autre Django runserver exemple (sur le port 8001) et le configure pour traiter toutes les connexions entrantes que si elles étaient effectuées à l'aide de HTTPS.

Faire de la runscript fichier que nous venons de créer un exécutable avec:

chmod a+x runserver

Maintenant, quand vous voulez exécuter votre serveur de développement exécuter ./runserver à partir de votre répertoire de projet. Pour l'essayer, il suffit de pointer votre navigateur http://localhost:8000 pour la normale du trafic HTTP, et https://localhost:8443 pour le trafic HTTPS. Notez que vous êtes navigateur sera presque certainement se plaindre du certificat utilisé et vous demandent d'ajouter une exception ou sinon explicitement demander au navigateur de continuer à naviguer. C'est parce que vous avez créé votre propre certificat et qu'il n'est pas approuvé par le navigateur à dire la vérité sur qui il est. C'est très bien pour le développement, mais de toute évidence ce n'est pas suffisant pour la production.

Malheureusement, sur mon ordinateur, ce runserver script ne se termine pas très bien, quand j'appuie sur Ctrl-C. j'ai manuellement tuer les processus - que quelqu'un a une suggestion pour résoudre ce problème?

Merci à Michael Gile de la poste et de django-l'armure wiki entrée pour le matériel de référence.

75voto

devonbleibtrey Points 162

Je vous conseille d'utiliser le django-sslserver paquet.

Le paquet actuel sur PyPI seulement prend en charge jusqu'à Django version 1.5.5, mais un patch a été commise par l'intermédiaire d' 5d4664c. Avec ce correctif, le système fonctionne bien et est assez simple et la solution simple et efficace pour tester les connexions https.

Mise à JOUR: Depuis que j'ai posté ma réponse à la commettre ci-dessus a été fusionné dans la branche master et une nouvelle version a été poussé à PyPI. Donc il ne devrait pas y avoir besoin de spécifier le 5d4664c de s'engager pour que le correctif spécifique.

12voto

Neil Points 1132

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

4voto

Micheal Lunny Points 1

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.

Écoutez toutes les interfaces locales sur le port 443 et transmettez-les au 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) de moins de 1024

1voto

fitz Points 69

Cela peut être fait 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 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: