选择x509身份验证的客户端证书对话框

时间:2017-10-09 14:34:14

标签: spring x509 client-certificates

我在Wildfly 10上运行了一个用Java + Spring编写的应用程序。我已经使用RootCA和客户端证书设置了基本的x509身份验证。

根据客户的证书CN,我可以处理多个用户角色。

我想要实现的是如何动态选择应该使用的客户端证书。访问https时会显示一个对话框(这是一个系统对话框 - 来自firefox)。但是此对话框只显示一次,然后即使在注销后,对话框也不会再次显示,并且会自动选择最后一个客户端证书。

即使我取消选择记住此决定,也会再次选择此证书。

拒绝在此处上传屏幕截图,因此有网址:https://imgur.com/a/PklHR

1 个答案:

答案 0 :(得分:2)

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

如我列出的错误earlier中所述,由于Firefox和Chrome记住了SSL状态(包括用于身份验证的任何客户端证书),因此会出现此问题。用户可以通过重新启动浏览器或clearing active logins手动清除此缓存。虽然仍然没有办法远程触发清除浏览器的SSL缓存,但有几种创造性的方法可以解决这个问题。

强制浏览器再次请求客户端证书的一种方法是强制TLS renegotiation,这将涉及再次交换TLS Client HelloServer Hello消息。例如,here是Apache使用TLS重新协商来升级"的情况。用户请求需要客户端证书的资源时的连接。

由于我不熟悉Spring框架,我不确切知道在特定情况下如何实现这一点,但是,我相当肯定它可以用Java完成。您可以查看TLS 1.2 RFC消息上的Hello Request部分,该部分会提示客户端回复Client Hello消息,从而有效地重新启动握手。

但是,此时,如果客户端已经使用证书进行了身份验证,则浏览器仍然会记住并发送它。服务器可以通过修剪它在certificate_authorities消息的<div class="form-group date-time-picker label-floating is-empty"> <label class="control-label">Birthday</label> <input name="datetimepicker" id="datetimepicker" required> <span class="input-group-addon"> <svg class="calendar-icon"><use xlink:href="icons/icons.svg#calendar-icon"></use></<svg> </span> </div> 部分中发送的接受的CA列表来强制客户端呈现不同的证书。如果您要使用的新证书由与旧证书相同的CA颁发,那么这显然不起作用。

我还看到过,如果再次出现相同的证书,则使用自定义逻辑来使SSL连接失败,但这并不能解决浏览器的证书内存问题。它只是阻止用户再次使用该站点,直到重新启动或清除活动登录,如上所述。希望有所帮助。