2012-03-15 17 views
7

Estoy usando certificados de cliente en sesiones de SSL para autenticar usuarios, pero tengo un problema con las sesiones en caché. (He configurado IIS para que acepte (no requiera) certificados de cliente)Borrar estado de certificado de cliente ssl desde javascript

Situación normal: Un usuario accede a la página donde se solicitó el certificado. El navegador inicia el selector de certificados, el usuario selecciona el certificado deseado (e inserte el PIN si es necesario) y todo avanza como debería.

Situación si no funciona como se esperaba: Un usuario accede a la página donde se solicitó el certificado. El navegador inicia el selector de certificado, el usuario selecciona el certificado deseado pero luego cancela el diálogo de PIN. El usuario se redirige a la página anterior porque no se envió ningún certificado. El usuario intenta volver a iniciar sesión pero falla automáticamente porque la última sesión de ssl se almacenó en caché.

Resolví esto en ie usando document.execCommand ("ClearAuthenticationCache"); pero todavía no funciona en FF y Chrome porque no son compatibles con dicho método. ¿Hay alguna forma de resolver esto?

Respuesta

6

Puede estar interesado en this discussion y this Chromium issue. En particular, debería probar:

if (window.crypto) window.crypto.logout(); 
+0

Parece tomará un tiempo para resolver ... Usando crypto in chrome me da esto: TypeError: Object # no tiene método 'logout. Según los desarrolladores, solo implementarán DOMCrypto después de que haya madurado y no implementarán crypto si se implementaran muy poco. http://www.mail-archive.com/[email protected]/msg16213.html Parte importante: "Me gustaría reiterar que no tenemos intención de habilitar este característica por defecto hasta que el proceso de especificación y estándares sea más maduro. Experimentar con esta API debería tener muy poco impacto en otros consumidores de WebKit ". – RicardoSBA

+1

Como señala @RuhollahDelpak, esto ya no funciona con las versiones recientes. – Bruno

3

para Chrome (al menos en 19.0.1084.30 beta), parece que, si se puede configurar una URL en el mismo nombre de host que requiere un certificado de cliente, pero rechaza todos los certificados , hacer una solicitud a esa URL tendrá el mismo efecto que window.crypto.logout(). Por ejemplo, si /ssl_logout/ es la dirección URL configurada especialmente: (. El uso de una página que contiene un iframe o img con src="/ssl_logout/" obras, también)

var xmlHttp = new XMLHttpRequest(); 
xmlHttp.onreadystatechange = function() { 
    // put any actions to carry out upon logout here 
}; 
xmlHttp.open("GET", "/ssl_logout/", true); 
xmlHttp.send(); 

+0

¿Cómo configuraría una url en apache o nginx? –

+0

¿Eso es posible? La negociación de SSL ocurre antes de que se transmita la URL, AFAIK. –

+1

@ DavidBalažic: [La documentación de Apache para 'SSLVerifyClient'] (http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslverifyclient) dice que se puede usar en los niveles de directorio o .htaccess, así que debe ser capaz de hacerlo después de la negociación. Me imagino que la negociación ocurre, la conexión se establece, Apache hace un poco más de trabajo, y luego puede rechazar el certificado, pero no sé lo suficiente sobre la mecánica subyacente de HTTPS para saber con certeza o cómo sucede. Verifiqué en el momento de la publicación que mi respuesta funcionó (con Apache, creo). – Isaac

1

En IE6 +:

document.execCommand('ClearAuthenticationCache'); 
+0

Esto no funciona, si el usuario no seleccionó ningún certificado. Él tiene que reiniciar el navegador. A menos que no sepa de ninguna otra solución. –

Cuestiones relacionadas