我的 Web 应用程序根据用户的 x509 证书对用户进行身份验证。目前,我已通过设置配置了 tomcat 以进行相互身份验证"clientAuth=want"
。但是,由于此证书交换发生在 SSL 握手阶段,我发现这种方法存在以下限制:
- 部署在同一个 tomcat 上的所有其他应用程序也要求提供用户的证书,但这可能不是必需的。
- 每当向服务器发出第一个请求时,它可以是任何公共 url,例如 css 或 img url,证书弹出窗口就会出现在用户的浏览器上。
- Javascript 从任何其他应用程序的 UI 调用我的 Web 应用程序,都会导致用户浏览器上弹出此窗口。
- 一旦建立 https 会话,后续请求仅包含最终用户的证书,而不是整个链。
有没有什么方法可以让我在应用程序需要时与浏览器协商并获取用户证书?
PS:我已经在 stackoverflow 上问过这个问题了,但是没有成功,因此在这里发布。
答案1
是的,但它不适用于 HTTP/2(不允许重新协商)或 TLSv1.3(因为 OpenJDK TLS 1.3 实现不支持握手后身份验证)。
您需要做的是:
clientAuth="want"
从连接器上移除- 配置 Web 应用程序进行
CLIENt-CERT
身份验证 - 配置安全约束,要求对需要证书的任何资源进行身份验证
- 可选地,使用 AuthenticatedUserRealm(假设您想允许所有具有有效证书的用户)