2011-11-05 13 views
73

Tengo una aplicación que usa cookies "seguras" y desea probar su funcionalidad sin la necesidad de configurar un complicado servidor de desarrollo con SSL habilitado. ¿Hay alguna manera de hacer esto tan simple como puedo probar las solicitudes no cifradas usando ./manage.py runserver?¿Cómo puedo probar las conexiones https con Django tan fácilmente como puedo conexiones que no sean https usando 'runserver'?

+0

¿No puede simplemente especificar runserver 443 para hacer que el servidor se ejecute en el puerto 443? – Furbeenator

+0

@Furbeenator: Desafortunadamente no, esto solo hará que el servidor HTTP en 443, lo que necesito es un servidor SSL real en ejecución. –

Respuesta

97

No es como tan simple como el servidor de desarrollo integrado, pero no es demasiado difícil utilizar el stunnel como intermediario SSLifying entre su navegador y el servidor de desarrollo. Stunnel le permite configurar un servidor liviano en su máquina que acepta conexiones en un puerto configurado, las envuelve con SSL y las transfiere a otro servidor. Lo usaremos para abrir un puerto stunnel (8443) y pasar el tráfico que recibe a una instancia de Django runserver.

Primero necesitará un stunnel que puede ser downloaded here o puede ser provisto 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 SSL.

mkdir stunnel 
cd stunnel 

A continuación necesitaremos crear un certificado local y la clave que se utilizará para la comunicación SSL. Para esto, recurrimos a openssl.

Cree la clave:

openssl genrsa 1024 > stunnel.key 

crear el certificado que utiliza esta clave (esto le pedirá un montón de información que será incluida en el certficate - acaba de responder con lo que se siente bien a usted):

openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert 

Ahora combinarlos en un solo archivo que stunnel utilizará para su comunicación SSL:

cat stunnel.key stunnel.cert > stunnel.pem 

Crear un archivo de configuración para stunnel llamados 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 indica stunnel lo que necesita saber. Específicamente, le está diciendo que no use un archivo pid, donde el archivo de certificado es, qué versión de SSL usar, que debe ejecutarse en primer plano, donde debe registrar su salida, y que debe aceptar la conexión en el puerto. 8443 y colóquelos junto al puerto 8001. El último parámetro (TIMEOUTclose) le dice que cierre automáticamente la conexión después de que transcurra 1 segundo sin actividad.

Ahora pop volver hasta el directorio del proyecto Django (el que tiene manage.py en ella):

cd .. 

Aquí vamos a crear una ejecución del servidor llamado script que va a ejecutar servidores stunnel y dos de desarrollo de Django (uno para las conexiones normales, y otra para las conexiones SSL):

stunnel4 stunnel/dev_https & 
python manage.py runserver& 
HTTPS=1 python manage.py runserver 8001 

rompamos esto abajo, línea por línea:

  • Línea 1: inicia el stunnel y lo señala al archivo de configuración que acabamos de crear.Esto tiene stunnel escucha en el puerto 8443, envolver cualquier conexión que recibe en SSL, y pasar a lo largo del puerto 8001
  • Línea 2: Inicia una Django normal de ejecución del servidor de instancia (en el puerto 8000)
  • Línea 3: Inicia otra ejecución del servidor de Django instancia (en el puerto 8001) y lo configura para tratar todas las conexiones entrantes como si se realizaran mediante HTTPS.

hacer que el archivo que acabamos de crear runscript ejecutable con:

chmod a+x runserver 

Ahora, cuando se desea ejecutar el servidor de desarrollo sólo hay que ejecutar ./runserver desde el directorio del proyecto. Para probarlo, simplemente apunte su navegador al 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 solicitará que agregue una excepción o instruya explícitamente al navegador para que siga navegando. Esto se debe a que creaste tu propio certificado y el navegador no confía en decir la verdad sobre quién es. Esto está bien para el desarrollo, pero obviamente no se reducirá para la producción.

Desafortunadamente, en mi máquina este script de runserver no sale bien cuando presiono Ctrl-C. Tengo que matar manualmente los procesos, ¿alguien tiene una sugerencia para solucionarlo?

Gracias a Michael Gile post y django-weave wiki entry para el material de referencia.

+3

Acabo de tropezar con esta respuesta. Algunas observaciones: no es necesario que ejecute una instancia de desarrollo separada en el 8001, también podría permitir que se conecte al puerto 8000. Si desea que el stunnel se elimine automáticamente, agregue una función y una captura de salida: kill_stunnel() { kill $ stunnel_pid} trap kill_stunnel exit stunnel4 stunnel/dev https & stunnel_pid = $ 1 – Friek

+2

La segunda instancia se invoca con HTTPS = 1, lo que significa que 'request.is_secure()' informará 'True'. Si no lo necesita, tiene razón; puede señalar el aturdimiento en una sola instancia. –

+0

Si se encuentra con el modo stunnel fips no compatible .... agregue fips = no al archivo dev_https para desactivarlo – yeahdixon

1

Se puede hacer en una línea con socat:

socat openssl-listen:8443,fork,reuseaddr,cert=server.pem,verify=0 tcp:localhost:8000 

, donde 8443 es un puerto para escuchar las conexiones HTTPS entrantes, server.pem es un certificado de servidor autofirmado y localhost: 8000 es una el servidor HTTP de depuración se inició como de costumbre.

Más detalles: http://www.dest-unreach.org/socat/doc/socat-openssltunnel.html

9

registrarse para poder https://ngrok.com/. Puede usar https para probar. Esto podría ayudar a las personas que solo quieren probar https rápidamente.

+0

Para una prueba rápida esta es una gran solución. Y no tuve que registrarme para nada, solo descargué y ejecuté ./ngrok http 8000, 8000 es mi puerto localhost. – GavKilbride

61

Recomendaría usar el paquete django-sslserver.

El paquete actual en PyPI solo admite hasta Django versión 1.5.5 pero se ha confirmado 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 ha sido merged en la rama principal y se ha enviado una nueva release a PyPI. Por lo tanto, no debería haber ninguna necesidad de especificar la confirmación 5d4664c para esa corrección específica.

+5

Esto parece prometedor: quizás tenga que actualizar la respuesta aceptada en este caso. ¿Alguien más quiere pesar? –

+1

Acabo de probarlo ahora, funciona como un encanto en 1.7c1. Aunque estoy a favor de respuestas interesantes, esta simplemente lo hace. La solución de stunnel es buena si el paquete django-sslserver deja de actualizarse. +1 para esta respuesta. – Plastefuchs

+3

esto debería convertirse en la respuesta aceptada, utilizada por un tiempo en un proyecto bastante complejo que simplemente no puede funcionar sin ejecutar en https y nunca tuvo problemas. –

4

Para aquellos que buscan una versión en primer plano de la opción stunnel para fines de depuración:

stunnel.pem es un certificado generado como en la parte superior de Evan Grimm votó respuesta.

Escuchar en todas las interfaces locales en el puerto 443 y adelante al puerto 80 en el servidor local

sudo stunnel -f -p stunnel.pem -P ~/stunnel.pid -r localhost:80 -d 443 

sudo solo es necesario que los puertos de entrada (-d [host:] puerto) por debajo del 1024

35

similares a django-SSLServer podría utilizar RunServerPlus de django-extensions

se tiene dependencias en Werkzeug (para que pueda obtener acceso a la excelente depurador Werkzeug) y pyOpenSSL (sólo para el modo SSL) para instalar de ejecución:

pip install django-extensions Werkzeug pyOpenSSL 

Agregar a INSTALLED_APPS en sus proyectos settings.py archivo:

INSTALLED_APPS = (
    ... 
    'django_extensions', 
    ... 
) 

continuación, puede ejecutar el servidor en modo SSL con:

./manage.py runserver_plus --cert /tmp/cert 

Esto creará un archivo cert en /tmp/cert.crt y un archivo de clave en /tmp/cert.key que luego se puede reutilizar para sesiones futuras.

Hay un montón de cosas adicionales incluidas en las extensiones django que puede encontrar de uso, así que vale la pena echar un vistazo rápido a los documentos.

+1

En realidad, la mejor respuesta para Django 1.6+ ya que django-sslserver no es compatible con la recarga automática para la nueva versión – Zat42

Cuestiones relacionadas