Tengo una aplicación que utiliza cookies "seguras" y quiero probar su funcionalidad sin necesidad de configurar un complicado servidor de desarrollo habilitado para SSL. ¿Hay alguna forma de hacer esto tan simplemente como puedo probar solicitudes no cifradas usando ./manage.py runserver
?
109
Respuestas:
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.
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:
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):
Ahora combine estos en un solo archivo que stunnel usará para su comunicación SSL:
Cree un archivo de configuración para stunnel llamado dev_https con el siguiente contenido:
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):
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):
Analicemos esto, línea por línea:
Haga que el archivo de ejecución que acabamos de crear sea ejecutable con:
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.
fuente
request.is_secure()
informaráTrue
. Si no lo necesita, entonces tiene razón: puede apuntar stunnel a una sola instancia."sslVersion = SSLv3": SSLv3 not supported
.stunnel_pid=$1
no funcionó para mí, pero lostunnel_pid=$!
hizo. ¿Cómo testunnel_pid=$1
funcionó?Recomendaría usar el paquete django-sslserver .
El paquete actual en PyPI solo admite hasta la versión 1.5.5 de Django, pero se ha enviado un parche a través de 5d4664c . Con esta solución, el sistema funciona bien y es una solución bastante simple y directa para probar conexiones https.
ACTUALIZACIÓN: Desde que publiqué mi respuesta, la confirmación anterior se ha fusionado en la rama maestra y se ha enviado una nueva versión a PyPI. Por lo tanto, no debería ser necesario especificar la confirmación 5d4664c para esa solución específica.
fuente
Similar a django-sslserver, puede usar RunServerPlus desde django-extensions
Tiene dependencias en Werkzeug (por lo que tiene acceso al excelente depurador Werkzeug) y pyOpenSSL (solo se requiere para el modo ssl), así que para instalar ejecutar:
Agréguelo a INSTALLED_APPS en el archivo settings.py de su proyecto:
Luego puede ejecutar el servidor en modo ssl con:
Esto creará un archivo de certificado en
/tmp/cert.crt
y un archivo de clave en el/tmp/cert.key
que se puede reutilizar para futuras sesiones.Hay un montón de cosas adicionales incluidas en django-extensions que puede resultarle útil, por lo que vale la pena echar un vistazo rápido a los documentos.
fuente
./manage.py runserver_plus --cert /tmp/cert 0.0.0.0:8000
solo instala
incluir sslserver en aps instalados
ahora puedes correr
fuente
Regístrese en https://ngrok.com/ . Puede usar https para probar. Esto podría ayudar a las personas que solo quieren probar https rápidamente.
fuente
Para aquellos que buscan una versión en primer plano de la opción stunnel con fines de depuración:
stunnel.pem es un certificado generado como en la respuesta más votada de Evan Grimm.
Escuche en todas las interfaces locales en el puerto 443 y reenvíe al puerto 80 en localhost
sudo solo es necesario para los puertos entrantes (-d [host:] puerto) por debajo de 1024
fuente
Emita el siguiente comando en la terminal
Comenzará la sesión ngrok. Enumerará dos URL. Uno está asignado a http: // localhost: 8000 . El segundo se asigna a https: // localhost: 8000 . Compruebe la captura de pantalla a continuación. Utilice cualquier URL. Se asignará a su servidor local.
fuente
allowed_host
Se puede hacer en una línea con socat:
, donde 8443 es un puerto para escuchar conexiones HTTPS entrantes, server.pem es un certificado de servidor autofirmado y localhost: 8000 es un servidor HTTP de depuración iniciado como de costumbre.
Más detalles: http://www.dest-unreach.org/socat/doc/socat-openssltunnel.html
fuente
Maneje SSL / TLS con un proxy como Nginx en lugar de Django. Nginx se puede configurar para escuchar en el puerto 443 y luego reenviar solicitudes a su servidor de desarrollo Django (normalmente
http://127.0.0.1:8000
). Una configuración de Nginx para esto podría tener el siguiente aspecto:También deberá asignar
django-dev.localhost
a127.0.0.1
y añadirdjango-dev.localhost
aALLOWED_HOSTS
ensettings.py
. En Linux, deberá agregar la siguiente línea a/etc/hosts
:Luego podrá llegar a su sitio de desarrollo yendo a
https://django-dev.localhost
en su navegador (deberá omitir la advertencia de seguridad de su navegador).fuente