Non è come semplice come il costruito nel server di sviluppo, ma non è troppo difficile ottenere qualcosa di simile utilizzando stunnel come intermediario SSLifying tra il browser e il server di sviluppo. Stunnel ti consente di configurare un server leggero sulla tua macchina che accetta connessioni su una porta configurata, le avvolge con SSL e le passa a un altro server. Lo useremo per aprire una porta stunnel (8443) e trasmettere tutto il traffico che riceve a un'istanza del server di esecuzione Django.
Per prima cosa avrai bisogno di stunnel che può essere scaricato qui o può essere fornito dal sistema di pacchetti della tua piattaforma (ad esempio:) apt-get install stunnel
. Userò la versione 4 di stunnel (ad esempio: /usr/bin/stunnel4
su Ubuntu), anche la versione 3 funzionerà, ma ha diverse opzioni di configurazione.
Per prima cosa crea una directory nel tuo progetto Django per contenere i file di configurazione necessari e le cose SSLish.
mkdir stunnel
cd stunnel
Successivamente dovremo creare un certificato locale e una chiave da utilizzare per la comunicazione SSL. Per questo ci rivolgiamo a openssl.
Crea la chiave:
openssl genrsa 1024 > stunnel.key
Crea il certificato che utilizza questa chiave (questo ti chiederà un mucchio di informazioni che saranno incluse nel certificato - rispondi semplicemente con ciò che ti fa sentire bene):
openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert
Ora combinali in un unico file che stunnel utilizzerà per la sua comunicazione SSL:
cat stunnel.key stunnel.cert > stunnel.pem
Crea un file di configurazione per stunnel chiamato dev_https con i seguenti contenuti:
pid=
cert = stunnel/stunnel.pem
sslVersion = SSLv3
foreground = yes
output = stunnel.log
[https]
accept=8443
connect=8001
TIMEOUTclose=1
Questo file dice a stunnel ciò che deve sapere. In particolare, gli stai dicendo di non usare un file pid, dove si trova il file del certificato, quale versione di SSL usare, che dovrebbe essere eseguito in primo piano, dove dovrebbe registrare il suo output e che dovrebbe accettare la connessione sulla porta 8443 e trasferirli alla porta 8001. L'ultimo parametro (TIMEOUTclose) indica di chiudere automaticamente la connessione dopo che è trascorso 1 secondo senza attività.
Ora torna alla directory del tuo progetto Django (quella con manage.py al suo interno):
cd ..
Qui creeremo uno script chiamato runserver che eseguirà stunnel e due server di sviluppo django (uno per le connessioni normali e uno per le connessioni SSL):
stunnel4 stunnel/dev_https &
python manage.py runserver&
HTTPS=1 python manage.py runserver 8001
Analizziamo questo, riga per riga:
- Riga 1: avvia stunnel e indirizzalo al file di configurazione che abbiamo appena creato. Questo ha l'ascolto stunnel sulla porta 8443, avvolge tutte le connessioni che riceve in SSL e le passa alla porta 8001
- Riga 2: avvia una normale istanza del server di esecuzione Django (sulla porta 8000)
- Riga 3: avvia un'altra istanza del server di esecuzione Django (sulla porta 8001) e la configura per trattare tutte le connessioni in entrata come se fossero eseguite utilizzando HTTPS.
Rendi eseguibile il file runscript che abbiamo appena creato con:
chmod a+x runserver
Ora, quando vuoi eseguire il tuo server di sviluppo, esegui semplicemente ./runserver
dalla directory del progetto. Per provarlo, punta il tuo browser su http: // localhost: 8000 per il normale traffico HTTP e https: // localhost: 8443 per il traffico HTTPS. Tieni presente che il tuo browser si lamenterà quasi sicuramente del certificato utilizzato e ti richiederà di aggiungere un'eccezione o altrimenti istruirà esplicitamente il browser a continuare la navigazione. Questo perché hai creato il tuo certificato e non è considerato attendibile dal browser che dica la verità su chi sia. Questo va bene per lo sviluppo, ma ovviamente non lo taglierà per la produzione.
Sfortunatamente, sulla mia macchina questo script runserver non esce bene quando premo Ctrl-C. Devo terminare manualmente i processi: qualcuno ha un suggerimento per risolverlo?
Grazie al post di Michael Gile e alla voce wiki di django-weave per il materiale di riferimento.