2012-03-26 17 views
8

Estoy escribiendo unaplicación para un grupo cerrado de usuarios. Se servirá solo https. El servidor debe verificar si el usuario tiene permiso para acceder al servidor al verificar el certificado ssl del usuario. Preferiría tener una lista blanca (campo ex con el usuario cert en perfil de usuario), que firmar con sus claves por mi CA. Como no habría usuario/pase, el contenido dependerá del certificado proporcionado por el cliente.autenticación de usuario a través de certs ssl en django

Sé que puedo simplemente proporcionar una lista de sus certs a apache/nginx, pero no me gusta esta solución porque tendría que mantener esta lista en dos lugares: apache (access/deny) y django: auth middleware (el contenido depende de qué certificado se proporcionó). Mantener esto podría ser una pesadilla.

¿Hay alguna otra manera agradable de hacer esto? ¿Tal vez debería dejar que django tome la cosa ssl?

Respuesta

10

He creado un módulo de Django para esto, la aplicación está disponible bajo licencia MIT github. Básicamente, el enfoque es para que:

  1. nginx maneja todo el SSL Certificado & cosas verificación
  2. motor de autenticación de Django mapea la (validados) certificados nombre completo para un modelo de lo que sea User que está utilizando.
+0

¿es posible realizar la autenticación del cliente utilizando el matraz? – nishi

+0

Tengo una aplicación django y los clientes tienen sus certificados digitales en memorias USB cómo leer sus certificados con django –

0

Antes que nada, hablas de dos maneras completamente diferentes de usar un certificado. Si usa un certificado firmado por el servidor de una CA, entonces el usuario se autenticará antes de la carga de la página (al crear un canal seguro) y sabrá quiénes son. De la otra manera que mencionas, almacenar el certificado de usuario en UserProfile, ¿te refieres a almacenar el certificado privado? Esto está muy lejos de un enfoque seguro. ¿Qué esperas exactamente guardar en el perfil del usuario, que te servirá para la autenticación? Y si lees esto desde UserProfile, ¿cómo se autenticará realmente el usuario? ¿Usando nombre de usuario + contraseña? Entonces, ¿cuál es el objetivo del certificado en el perfil?

No haría SSL en Django. Un enfoque más adecuado para manejar esto es mantener todo el material SSL en Apache usando un encabezado HTTP después. Usted emite un certificado al usuario, lo agrega en sus navegadores y, cuando se conecta al sitio, Django verifica el certificado y extrae el nombre de usuario asociado con la solicitud. A continuación, transfiera este nombre de usuario como encabezado HTTP a la aplicación Django, p. HTTP_USER_NAME = some_user. También asegúrese de que Apache elimina todos los encabezados de la solicitud del cliente. Entonces su aplicación Django no debería hacer nada más: confiará en que Apache ya hizo el trabajo AUTH y obtendrá el nombre de usuario. (Esto funciona bien con Nginx, y aunque no lo he usado en Apache, no veo una razón por la que no sea posible con él también, tal vez necesites un poco de mod de Apache para instalarlo).

Por lo tanto, la única desventaja de este enfoque es que probablemente tendrá que hacer un trabajo manual con la firma/envío de certificados al usuario, pero si esta no es una operación que se repite con frecuencia, parece estar bien a cambio de la seguridad Ofrece.

ACTUALIZACIÓN: Este es un ejemplo de cómo hacer la autenticación SSL en Apache: http://www.zeitoun.net/articles/client-certificate-x509-authentication-behind-reverse-proxy/start y para nginx: http://forum.nginx.org/read.php?5,226319

Cuestiones relacionadas