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'?
Respuesta
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.
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
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. –
Si se encuentra con el modo stunnel fips no compatible .... agregue fips = no al archivo dev_https para desactivarlo – yeahdixon
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
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.
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
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.
Esto parece prometedor: quizás tenga que actualizar la respuesta aceptada en este caso. ¿Alguien más quiere pesar? –
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
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. –
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
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.
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
- 1. Conexiones HTTPS sobre servidores proxy
- 2. ¿Cyclone (python) es compatible con conexiones HTTPS y SSL?
- 3. ¿cómo puedo liberar las conexiones mongodb?
- 4. ¿Cómo hacer que las páginas php/html sean seguras/https?
- 5. ¿Cómo puedo hacer que las cookies sean seguras (solo https) por defecto en los rieles?
- 6. ¿Cómo usar SSL/HTTPS con Meteor?
- 7. Django @login_required dejando caer https
- 8. Cómo encontrar lo que está usando las conexiones en mi grupo de conexiones
- 9. ¿Cómo puedo configurar expressjs para manejar tanto http como https?
- 10. ¿Cómo puedo hacer una llamada usando HTTPS HttpService en flexión
- 11. http_referer perdido usando https
- 12. ¿Cómo puedo usar diferentes certificados en conexiones específicas?
- 13. Cómo matar las conexiones de MySQL
- 14. Sirviendo páginas de Django seguras con HTTPS
- 15. PostgreSQL: deshabilitar temporalmente las conexiones
- 16. ¿Cómo puedo unir conexiones utilizando psycopg y gevent?
- 17. ¿Cómo hacer que file_get_contents() funcione con HTTPS?
- 18. Usando System.Net.WebClient con el certificado HTTPS
- 19. ¿Qué puede hacer que SqlClient reutilice las conexiones no válidas?
- 20. ¿Puedo usar Apache mod_proxy como un grupo de conexiones, bajo Prefork MPM?
- 21. C# WebClient con https
- 22. ASIHTTPRequest - HTTPS
- 23. Sesiones WCF con HTTPS
- 24. ¿Cómo puedo hacer que los saltos de la etiqueta vim sean tan inteligentes como OmniCppComplete?
- 25. cómo redirigir https: // a https: // www
- 26. descarga con curl usando conexiones múltiples
- 27. Node.js que lucha con muchas conexiones simultáneas
- 28. ¿Hay otras herramientas de interceptación HTTP/HTTPS que no sean Fiddler, Charles, Poster y Achilles?
- 29. Enlazando el protocolo http/https en IE hace que las solicitudes GET sean secuenciales
- 30. caída de las conexiones con tcp_tw_recycle
¿No puede simplemente especificar runserver 443 para hacer que el servidor se ejecute en el puerto 443? – Furbeenator
@Furbeenator: Desafortunadamente no, esto solo hará que el servidor HTTP en 443, lo que necesito es un servidor SSL real en ejecución. –