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.htmlAhora 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