No es tan simple como el servidor de desarrollo integrado, pero no es demasiado difícil conseguir algo parecido utilizando stunnel como intermediario SSLificador entre su navegador y el servidor de desarrollo. Stunnel le permite configurar un servidor ligero en su máquina que acepta conexiones en un puerto configurado, las envuelve con SSL y las pasa a otro servidor. Usaremos esto para abrir un puerto de stunnel (8443) y pasar cualquier tráfico que reciba a una instancia de Django runserver.
Primero necesitará stunnel que se puede descargar aquí o puede ser proporcionado por el sistema de paquetes de su plataforma (por ejemplo :) apt-get install stunnel
. Usaré la versión 4 de stunnel (por ejemplo: /usr/bin/stunnel4
en Ubuntu), la versión 3 también funcionará, pero tiene diferentes opciones de configuración.
Primero cree un directorio en su proyecto Django para contener los archivos de configuración necesarios y el material SSLish.
mkdir stunnel
cd stunnel
A continuación, necesitaremos crear un certificado y una clave locales que se utilizarán para la comunicación SSL. Para ello recurrimos a openssl.
Crea la clave:
openssl genrsa 1024 > stunnel.key
Cree el certificado que usa esta clave (esto le pedirá un montón de información que se incluirá en el certificado; solo responda con lo que le parezca bien):
openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert
Ahora combine estos en un solo archivo que stunnel usará para su comunicación SSL:
cat stunnel.key stunnel.cert > stunnel.pem
Cree un archivo de configuración para stunnel llamado dev_https con el siguiente contenido:
pid=
cert = stunnel/stunnel.pem
sslVersion = SSLv3
foreground = yes
output = stunnel.log
[https]
accept=8443
connect=8001
TIMEOUTclose=1
Este archivo le dice a Stunnel lo que necesita saber. Específicamente, le está diciendo que no use un archivo pid, dónde está el archivo de certificado, qué versión de SSL usar, que debe ejecutarse en primer plano, dónde debe registrar su salida y que debe aceptar la conexión en el puerto. 8443 y trasládelos al puerto 8001. El último parámetro (TIMEOUTclose) le dice que cierre automáticamente la conexión después de que haya pasado 1 segundo sin actividad.
Ahora regrese al directorio de su proyecto Django (el que tiene manage.py en él):
cd ..
Aquí crearemos un script llamado runserver que ejecutará stunnel y dos servidores de desarrollo de django (uno para conexiones normales y otro para conexiones SSL):
stunnel4 stunnel/dev_https &
python manage.py runserver&
HTTPS=1 python manage.py runserver 8001
Analicemos esto, línea por línea:
- Línea 1: inicia stunnel y apúntalo al archivo de configuración que acabamos de crear. Esto hace que Stunnel escuche en el puerto 8443, envuelva las conexiones que reciba en SSL y las pase al puerto 8001
- Línea 2: inicia una instancia normal de Django runserver (en el puerto 8000)
- Línea 3: inicia otra instancia del servidor de ejecución de Django (en el puerto 8001) y la configura para tratar todas las conexiones entrantes como si se estuvieran realizando mediante HTTPS.
Haga que el archivo de ejecución que acabamos de crear sea ejecutable con:
chmod a+x runserver
Ahora, cuando desee ejecutar su servidor de desarrollo, simplemente ejecútelo ./runserver
desde el directorio de su proyecto. Para probarlo, simplemente apunte su navegador a http: // localhost: 8000 para el tráfico HTTP normal y https: // localhost: 8443 para el tráfico HTTPS. Tenga en cuenta que su navegador casi definitivamente se quejará del certificado utilizado y le pedirá que agregue una excepción o que indique explícitamente al navegador que continúe navegando. Esto se debe a que creó su propio certificado y el navegador no confía en él para decir la verdad sobre quién es. Esto está bien para el desarrollo, pero obviamente no será suficiente para la producción.
Desafortunadamente, en mi máquina, esta secuencia de comandos del servidor de ejecución no sale bien cuando presiono Ctrl-C. Tengo que matar manualmente los procesos, ¿alguien tiene una sugerencia para solucionarlo?
Gracias a la publicación de Michael Gile y la entrada wiki de django-weave por el material de referencia.