【问题标题】:Select client certificate dialog for x509 authentication为 x509 身份验证选择客户端证书对话框
【发布时间】:2018-03-20 19:26:21
【问题描述】:

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

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

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

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

这里是拒绝上传截图,所以有url:https://imgur.com/a/PklHR

【问题讨论】:

  • 这是FirefoxChrome 浏览器的已知问题。它们都没有提供在浏览器运行时清除 SSL 状态的方法,IE 实际上设法做到了这一点。结果是这种烦人的“记忆”效应,一旦选择(或取消),您就无法更改所使用的证书。
  • 您好,谢谢您的解释。您似乎对这种机制有所了解:)。有没有可以管理它的库(可能是 js?)?

标签: spring x509 client-certificates


【解决方案1】:

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

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

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

由于我不熟悉 Spring 框架,我不知道在您的具体情况下这将如何完成,但是,我相当肯定它可以在 Java 中完成。您可以查看Hello Request 消息上的TLS 1.2 RFC 部分,它会提示客户端以Client Hello 消息进行响应,从而有效地重新启动握手。

然而,此时,如果客户端已经使用证书进行了身份验证,浏览器仍然会记住并发送它。服务器可能能够通过修剪它在其Certificate Request 消息的certificate_authorities 部分中发送的接受的CA 列表来强制客户端提供不同的证书。如果您要使用的新证书是由与旧证书相同的 CA 颁发的,这显然不起作用。

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

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2014-05-01
    • 2017-12-11
    • 1970-01-01
    • 2011-04-09
    • 2013-10-07
    • 2013-02-02
    • 1970-01-01
    • 2022-06-23
    相关资源
    最近更新 更多