我希望能够将Web浏览器客户端和(自动)服务客户端同时接受在我的应用程序中运行的单个servlet。一些服务客户端将使用TLS客户端证书进行身份验证,但有些则不会。我不希望Web浏览器客户端被提示输入证书,即使用户已在浏览器中安装了某些证书也是如此。是否提示客户端证书的决定是动态的,并且取决于客户端的策略,因此无法在web.xml中静态配置。
是否有一种方法可以动态触发TLS重新协商以从Servlet内部请求客户端证书?如果可以访问原始SSLSocket,则可以将其配置为需要客户端证书,然后调用startHandshake()强制重新协商。据我所知,虽然没有可移植的方式来获取与Servlet请求/响应相关的SSLSocket。
我的应用程序必须在各种servlet容器中运行,因此,我尽可能避免使用特定于容器的解决方案。理想情况下,该解决方案不涉及重定向,但是我接受的是唯一的方法。
答案 0 :(得分:0)
您在上面的评论中写道:
因为该设置将导致网络浏览器提示用户 如果安装的证书与以下证书之一匹配,请选择证书 配置的CA。我从不希望网络浏览器发生这种情况 客户
然后我为此投票是不可能从服务器端实现的。 TLS首先通过安全通道发送任何数据。您无法确定是Web浏览器还是不敲门询问客户身份。从TLS的角度来看,这只是另一个未命名的网络客户端尝试进行的连接。建立安全连接后,将发送数据,您可以确定是否是浏览器。
您可能希望通过不同的端点通过管道传输浏览器(1路ssl)和服务器客户端(2路ssl)。
否则,您可能要实现自己的TLS协议握手过程。
您可能希望配置浏览器不回答客户端证书请求,而不是配置服务器不询问(如果可能)确定这是基于浏览器的客户端。可以尝试通过密码套件(受支持的加密模式列表)猜测它,但这绝对不是servlet交互级别。
我很好奇有人知道如何解决您的问题。