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
?
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:
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.
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.
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.
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
Inscrivez-vous à https://ngrok.com/ . Vous pouvez utiliser https pour tester. Cela pourrait aider les personnes qui souhaitent simplement tester rapidement https.
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
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