web-dev-qa-db-fra.com

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

J'ai une application qui utilise des cookies "sécurisés" et je veux tester ses fonctionnalités sans avoir besoin de configurer un serveur de développement compatible SSL compliqué. Existe-t-il un moyen de le faire aussi simplement que je peux tester les demandes non chiffrées en utilisant ./manage.py runserver?

93
Evan Grim

Ce n'est pas aussi aussi simple que le serveur de développement intégré, mais il n'est pas trop difficile de se rapprocher en utilisant stunnel comme intermédiaire SSLifying entre votre navigateur et le développement serveur. 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 le trafic qu'il reçoit à une instance de Django runserver).

Vous aurez d'abord besoin d'un stunnel qui peut être téléchargé ici ou peut être fourni par le système de package 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 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 trucs SSLish.

mkdir stunnel
cd stunnel

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

Créez la clé:

openssl genrsa 1024 > stunnel.key

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

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ù se trouve le fichier de certificat, quelle version de SSL utiliser, qu'il doit s'exécuter au premier plan, où il doit consigner sa sortie et qu'il doit 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 1 seconde sans aucune activité.

Maintenant, revenez à votre Django (celui avec manage.py dedans):

cd ..

Ici, nous allons créer un script nommé runserver qui exécutera stunnel et deux Django serveurs de développement (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

Décomposons cela, ligne par ligne:

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

Rendez le fichier runscript que nous venons de créer exécutable avec:

chmod a+x runserver

Maintenant, lorsque vous souhaitez exécuter votre serveur de développement, exécutez simplement ./runserver depuis le répertoire de votre projet. Pour l'essayer, pointez simplement votre navigateur sur http: // localhost: 80 pour le trafic HTTP normal et https: // localhost: 844 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 est. C'est très bien pour le développement, mais ne le fera évidemment pas pour la production.

Malheureusement, sur ma machine, ce script runserver ne se termine pas bien lorsque je frappe Ctrl-C. Je dois tuer manuellement les processus - quelqu'un a-t-il une suggestion pour résoudre ce problème?

Merci à Michael Gile post et Django-weave entrée wiki pour le matériel de référence.

104
Evan Grim

Je recommanderais d'utiliser le package Django-sslserver .

Le paquet actuel sur PyPI ne prend en charge que jusqu'à Django version 1.5.5 mais un correctif a été validé via 5d4664c . Avec ce correctif, le système fonctionne bien et est un joli solution simple et directe pour tester les connexions https.

MISE À JOUR: Depuis que j'ai posté ma réponse, le commit ci-dessus a été fusionné dans la branche master et un nouveau release a été poussé vers PyPI. Il ne devrait donc pas être nécessaire de spécifier la validation 5d4664c pour ce correctif spécifique.

75
devonbleibtrey

Similaire à Django-sslserver, vous pouvez utiliser RunServerPlus de Django-extensions

Il a des dépendances sur Werkzeug (donc vous avez accès à l'excellent débogueur Werkzeug) et pyOpenSSL (seulement requis pour le mode ssl) donc pour installer run:

pip install Django-extensions Werkzeug pyOpenSSL

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

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 cert à /tmp/cert.crt et un fichier clé à /tmp/cert.key qui peut ensuite ê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, donc cela vaut la peine de parcourir rapidement les documents.

54
djsutho

il suffit d'installer

Sudo pip install Django-sslserver

inclure le serveur SSL dans les applications installées

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

maintenant tu peux courir

 python manage.py runsslserver 0.0.0.0:8888
13

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

12
Neil

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 sur toutes les interfaces locales sur le port 443 et retransmettez 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 [Host:] port) sous 1024

4
Micheal Lunny

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

1
uri.z