autenticacion mediante certificados

197 views
Skip to first unread message

Jose Caballero

unread,
May 9, 2009, 9:32:07 PM5/9/09
to djan...@googlegroups.com
Hola,

alguien sabe si es posible con django permitir a los usuarios autenticarse mediante un certificado digital (en lugar de username/password) para que luego el servidor se autentifique a su vez en nombre del usuario, presentado dicho certificado, y poder ejecutar acciones "contra" otros servicios que solo dicho usuario podria hacer?


Gracias por adelantado.

Saludos,
Jose

k0001

unread,
May 10, 2009, 5:27:27 PM5/10/09
to djan...@googlegroups.com
2009/5/9 Jose Caballero <jcaball...@gmail.com>:

> alguien sabe si es posible con django permitir a los usuarios autenticarse
> mediante un certificado digital (en lugar de username/password) para que
> luego el servidor se autentifique a su vez en nombre del usuario, presentado
> dicho certificado, y poder ejecutar acciones "contra" otros servicios que
> solo dicho usuario podria hacer?

http://docs.djangoproject.com/en/dev/topics/auth/#other-authentication-sources


Saludos,

Renzo Carbonara

Erny

unread,
May 13, 2009, 7:20:19 PM5/13/09
to djan...@googlegroups.com
Lo más fácil es poner Apache delante que solicitar el certificado en una determinada URL lo que puedes hacer con Location.

Echa un vistazo a la documentación de Apache:
http://httpd.apache.org/docs/2.2/ssl/ssl_howto.html

Allí verás fácilmente que con la directiva:
SSLVerifyClient require

Apache solicita al cliente (navegador) el certificado.
Además, hace comprobaciones básica si es certificado es válido y no ha caducado. Una vez validado, todos los datos del certificado están disponibles en variables de entorno que podrás leer fácilmente desde Django.

Las variables de entorno puedes encontrar aquí:
http://httpd.apache.org/docs/2.2/mod/mod_ssl.html

Ahora depende si quieres autenticar con el nombre que hay dentro del certificado(SSL_CLIENT_S_DN), por el serial (SSL_CLIENT_M_SERIAL), por el certificado completo (SSL_CLIENT_CERT).

Implementar un backend de autenticación es bastante fácil.

Nota: Creo que con lighttpd aún no es posible, pero nosotros aplicamos algún parche existente para poder obtener los datos del certificado.

Erny

Jose Caballero

unread,
May 13, 2009, 7:28:20 PM5/13/09
to djan...@googlegroups.com
Hola Ernesto.

Gracias por tus comentarios. Tengo que revisar esos links.
Pero antes, una pregunta a ciegas. Si dejo esa funcion (pedir el certificado) a Apache, lo haria siempre, incluso cuando no es una aplicacion gestionada a traves de django?

Sobre el otro asunto que comentas, la certificacion en nombre del usuario dependeria del sistema "contra" el que me quiero autenticar. En general con el DN es suficiente aunque a veces necesito el certificado completo.


Gracias.
Jose

Erny

unread,
May 13, 2009, 7:54:37 PM5/13/09
to djan...@googlegroups.com
Hola.


El 14 de mayo de 2009 1:28, Jose Caballero <jcaball...@gmail.com> escribió:
Hola Ernesto.

Gracias por tus comentarios. Tengo que revisar esos links.
Pero antes, una pregunta a ciegas. Si dejo esa funcion (pedir el certificado) a Apache, lo haria siempre, incluso cuando no es una aplicacion gestionada a traves de django?

Sólo lo aplicas a un subdirectorio, es decir, suponte que tienes unos views especiales de autenticación en:
/login/cert

entonces defines en Apache para que solicite certificado allí:
<Location /login/cert>
SSLEngineOn
SSLVerifyClient require
...
</Location>
 
de manera que una vez autenticado, ya no pide los certificados. Inicias sesión y listo.

Lo hice de manera parecida para autenticación NTLM, ya que el módulo era lento por lo que sólo se solicitaba una vez al iniciar la sesión.

De todos modos, no te deberías preocupar mucho, porque la maquinaria del navegador no vuelve a preguntar el certificado, una vez que lo haya obtenido.

Erny


Jose Caballero

unread,
May 13, 2009, 8:04:17 PM5/13/09
to djan...@googlegroups.com
No me he explicado bien.
No me preocupa de pida el certificado varias veces o solo la primera.

El asunto es que tenemos un servidor para varios proyectos a los vez. Y lo que no quiero es que siempre que use ese servidor me pida un certificado cuando solo lo necesito para uno de los proyectos.

Pero supongo que la respuesta es estudiarme la documentacion de Apache.

Jose

Erny

unread,
May 18, 2009, 1:27:43 PM5/18/09
to djan...@googlegroups.com
La solicitud de certificado se activa sobre un directorio,

por ejemplo
sitio/   -> no
sitio/dir1 -> no
sitio/dir2 -> sí
sitio/dir3 -> no

etc.

Eso lo consigues poniendo SSLVerifyClient Require dentro de una directiva <Location>, <Directory> o <VirtualHost>, tal como lo he descrito. Así que la autenticación sólo se aplica a un subárbol de directorios (virtuales).

Erny

Jose Caballero

unread,
May 18, 2009, 2:13:23 PM5/18/09
to djan...@googlegroups.com
Muchas gracias por la aclaracion.

Saludos,
Jose
Reply all
Reply to author
Forward
0 new messages