首页 > 解决方案 > 有没有办法在 servlet 中动态触发 SSL/TLS 重新协商?

问题描述

我希望能够接受 Web 浏览器客户端和(自动)服务客户端到在我的应用程序中运行的单个 servlet。一些服务客户端将使用 TLS 客户端证书进行身份验证,但有些则不会。我不希望 Web 浏览器客户端被提示输入证书,即使用户在他们的浏览器中安装了一些证书。是否提示客户端证书的决定是动态的,并且基于客户端的策略,因此不能在 web.xml 中静态配置。

有没有办法动态触发 TLS 重新协商以从 servlet 中请求客户端证书?如果我可以访问原始 SSLSocket,那么我可以将其配置为需要客户端证书,然后调用startHandshake()来强制重新协商。据我所知,没有可移植的方法来获取与 servlet 请求/响应关联的 SSLSocket。

我的应用程序必须在各种 servlet 容器中运行,因此如果可能,我宁愿避免使用特定于容器的解决方案。理想情况下,解决方案不会涉及重定向,但如果这是唯一的方法,我会接受。

标签: javasslservletsservlet-3.0

解决方案


你在上面的评论中写道:

因为该设置将导致 Web 浏览器提示用户选择一个证书,如果他们安装了一个与配置的 CA 之一匹配的证书。我从不希望 Web 浏览器客户端发生这种情况

然后我投票赞成这是不可能从服务器端实现的。TLS 先于通过安全通道发送的任何数据。您无法确定是网络浏览器还是不敲门而不询问客户身份。从 TLS 的角度来看,这只是另一个未命名的网络客户端尝试连接。建立安全连接后,发送数据,您可以确定这是不是浏览器。

您可能希望通过不同的端点管道浏览器(1 路 ssl)和服务器客户端(2 路 ssl)。

否则,您可能希望实现自己的 TLS 协议握手过程。

您可能希望将浏览器配置为不响应客户端证书请求,而不是配置服务器不询问是否(如果可能)确定这是基于浏览器的客户端。可能会尝试通过密码套装(支持的加密模式列表)来猜测它,但这绝对不是 servlet 级别的交互。

我很好奇有人知道如何解决你的问题。


推荐阅读