清除JavaScript中的SSL客户端证书状态

11
我正在使用SSL会话中的客户端证书来认证用户,但我在缓存会话方面遇到了一些问题。(我已经配置了IIS以接受而不是要求客户端证书。)
正常情况: 用户访问要求证书的页面。浏览器启动证书选择器,用户选择所需证书(如果需要,输入PIN码),然后一切顺利进行。
情况不如预期的情况: 用户访问要求证书的页面。浏览器启动证书选择器,用户选择所需证书,但随后在PIN对话框中取消。由于未发送任何证书,因此将用户重定向到上一页。用户尝试再次登录,但由于上一个SSL会话被缓存,因此自动失败。
我在IE中使用了document.execCommand("ClearAuthenticationCache");解决了这个问题,但是在FF或Chrome中仍然无法工作,因为它们不支持该方法。有什么解决方法吗?
3个回答

6

看起来解决这个问题需要一些时间... 在Chrome中使用加密功能时,它会给我返回以下错误:TypeError: Object #<Crypto> has no method 'logout。根据开发人员的说法,他们只会在DOMCrypto成熟后实现它,并且不会在已经实现了很少的地方实现加密功能。http://www.mail-archive.com/webkit-dev@lists.webkit.org/msg16213.html 重要部分: “我想再次强调,我们没有打算在规范和标准流程更加成熟之前默认启用此功能。尝试使用此API对WebKit的其他用户应该没有什么影响。” - RicardoSBA
3
正如 @RuhollahDelpak 指出的那样,这在最近的版本中已经不再适用。 - Bruno

4

对于Chrome(至少在19.0.1084.30 beta版本中),似乎如果您可以在相同的主机名上设置一个需要客户端证书但拒绝所有证书的URL,那么向该URL发送请求将产生与window.crypto.logout()相同的效果。例如,如果/ssl_logout/是特别配置的URL:

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

(使用包含iframe或img且src为“/ssl_logout/”的页面也可以实现。)

你会如何在Apache或Nginx中配置这样的URL? - Nick Retallack
1
@DavidBalažic:SSLVerifyClient的Apache文档说明它可以在目录或.htaccess级别使用,因此它必须能够在协商后执行。我想协商会发生,连接建立,Apache会做更多的工作,然后拒绝证书,但我不知道HTTPS的底层机制足够了解确切的情况或如何发生。我当时验证了我的答案是否有效(我认为是用Apache)。 - Isaac
1
@NickRetallack:我相信我在Apache中使用了SSLVerifyClient requireSSLVerifyDepth 0来实现这一点,因此(几乎)任何证书都会验证失败(我想,从技术上讲,有人可能会提供一个已知于Apache的根证书并且可能会验证通过...)。 - Isaac
@NickRetallack:或者使用window.crypto解决方案?这似乎是一个更好的解决方案,只是2年前在不同的浏览器上没有得到支持...也许现在可以了? - Isaac
@NickRetallack:啊,还是这样吗?那真不幸。而且看起来nginx不会添加更细粒度的ssl_verify_client - Isaac
显示剩余2条评论

1
在IE6+中:
document.execCommand('ClearAuthenticationCache');

这种方法不起作用,如果用户没有选择证书。他必须重新启动浏览器。除非我不知道其他解决方案。 - David Balažic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接