Ce n'est pas comme Mais il n'est pas difficile d'obtenir quelque chose d'approchant en utilisant stunnel comme intermédiaire SSL 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 de 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 du serveur d'exécution de Django.
Tout d'abord, vous aurez besoin de stunnel qui peut être téléchargé ici ou peut être fourni par le système de paquets de votre plateforme (par ex : apt-get install stunnel
). Je vais utiliser la version 4 de stunnel (par ex : /usr/bin/stunnel4
sur Ubuntu), la version 3 fonctionnera également, mais a des options de configuration différentes.
Tout d'abord, créez un répertoire dans votre projet Django pour contenir les fichiers de configuration et les éléments SSL nécessaires.
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é (il vous sera demandé un tas d'informations qui seront incluses dans le certificat - répondez simplement avec ce qui vous semble bon) :
openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert
Combinez-les maintenant 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 en avant-plan, où il doit consigner sa sortie et qu'il doit accepter les connexions sur le port 8443 et les transférer sur le port 8001. Le dernier paramètre (TIMEOUTclose) lui indique de fermer automatiquement la connexion après une seconde d'inactivité.
Maintenant, retournez dans le répertoire de votre projet Django (celui qui contient manage.py) :
cd ..
Ici, nous allons créer un script nommé runserver qui va exécuter 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 ça, ligne par ligne :
- Ligne 1 : Démarre stunnel et le fait pointer vers le fichier de configuration que nous venons de créer. Ainsi, stunnel écoute sur le port 8443, enveloppe toutes les connexions qu'il reçoit en SSL et les transmet au port 8001.
- Ligne 2 : Démarre une instance normale du runserver Django (sur le port 8000)
- Ligne 3 : Démarre une autre instance du runserver Django (sur le port 8001) et la configure pour qu'elle traite toutes les connexions entrantes comme si elles étaient effectuées en utilisant HTTPS.
Rendez le fichier runcript que nous venons de créer exécutable avec :
chmod a+x runserver
Maintenant, lorsque vous voulez lancer votre serveur de développement, il suffit d'exécuter ./runserver
à partir du répertoire de votre projet. Pour l'essayer, il suffit de faire pointer 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 donner des instructions explicites au navigateur pour continuer à naviguer. Cela s'explique par le fait que vous avez créé votre propre certificat et que le navigateur n'a pas confiance en son authenticité. C'est très bien pour le développement, mais ce n'est évidemment pas suffisant pour la production.
Malheureusement, sur ma machine, ce runserver script ne sort pas gentiment lorsque j'appuie sur Ctrl-C. Je dois tuer manuellement les processus - quelqu'un a-t-il une suggestion pour réparer cela ?
Grâce à l'article de Michael Gile poste et de django-weave entrée wiki pour le matériel de référence.
0 votes
Ne pouvez-vous pas simplement spécifier runserver 443 pour que le serveur fonctionne sur le port 443 ?
1 votes
@Furbeenator : Malheureusement non - cela ne fera que rendre le serveur HTTP sur 443, ce dont j'ai besoin c'est d'un serveur SSL réel.