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.
mkdir stunnel
cd stunnel
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é:
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 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):
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
Décomposons ceci, ligne par ligne:
- Ligne 1: Démarre stunnel et pointez-le vers le fichier de configuration que nous venons de créer. Cela a stunnel écouter sur le port 8443, envelopper toutes les connexions qu'il reçoit en SSL et les transmettre au port 8001
- Ligne 2: Démarre une instance Django runserver normale (sur le port 8000)
- Ligne 3: Démarre une autre instance de Django runserver (sur le port 8001) et la configure pour traiter toutes les connexions entrantes comme si elles étaient effectuées en 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
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.