选择客户端证书对话框用于x509身份验证。

5
我有一个使用Java + Spring编写,在Wildfly 10上运行的应用程序。我已经使用我的RootCA和客户端证书设置了基本的x509身份验证。
根据客户端证书CN,我可以处理多个用户角色。
我想要实现的是一种动态选择应该使用的客户端证书的方法。访问https时会显示对话框(这是来自Firefox的系统对话框)。但是,此对话框仅显示一次,即使注销后,对话框也不会再次显示,并且会自动选择上次使用的客户端证书。
即使我取消选择“记住此决定”,此证书也将再次被选择。
无法在此处上传截图,因此这里有一个网址:https://imgur.com/a/PklHR

这是Firefox和Chrome浏览器都已知的问题。它们都没有提供在浏览器运行时清除SSL状态的方法,而IE则成功做到了这一点。结果就是出现了这种令人烦恼的“记忆”效应,在选定(或取消)证书后无法更改使用的证书。 - AfroThundr
嗨,感谢您的解释。看起来您对这个机制有所了解 :). 是否有任何库(可能是js?)可以管理它? - user2336793
1个回答

5

TL;DR:目前没有绝对可靠的方法从服务器端强制使用新客户端证书进行重新认证,但在大多数情况下,用户可以手动完成。

如我之前列出的漏洞所述,这种行为是由于Firefox和Chrome记忆SSL状态,包括用于身份验证的任何客户端证书。用户可以通过重新启动浏览器或清除活动登录来手动清除此缓存。虽然仍然没有远程触发清除浏览器SSL缓存的方法,但已经有几种创造性的方法来解决这个问题。

一种强制浏览器再次请求客户端证书的方法是强制进行TLS重新协商,这将涉及再次交换TLS Client HelloServer Hello消息。例如,此处是Apache使用TLS重新协商来“升级”连接的案例,当用户请求需要客户端证书的资源时。
由于我不熟悉Spring Framework,我不知道在您的具体情况下如何实现,但我相当确定它可以在Java中完成。您可以查看TLS 1.2 RFC关于Hello Request消息的部分,这将提示客户端响应Client Hello消息,有效地重新启动握手。
然而,如果客户端已经通过证书进行了身份验证,浏览器仍然会记住并发送该证书。服务器可以通过修剪在其Certificate Request消息的certificate_authorities部分中发送的接受CA列表来强制客户端呈现不同的证书。但是,如果您想要使用的新证书是由与旧证书相同的CA颁发的,则此方法显然不起作用。
我还见过一些使用自定义逻辑以使SSL连接失败的情况,如果再次呈现相同的证书,但这并不能解决浏览器的证书存储问题。它只是防止用户再次使用该站点,直到重新启动或清除活动登录,如上所述。希望这有所帮助。

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