java - 有没有办法在 servlet 中动态触发 SSL/TLS 重新协商?
问题描述
我希望能够接受 Web 浏览器客户端和(自动)服务客户端到在我的应用程序中运行的单个 servlet。一些服务客户端将使用 TLS 客户端证书进行身份验证,但有些则不会。我不希望 Web 浏览器客户端被提示输入证书,即使用户在他们的浏览器中安装了一些证书。是否提示客户端证书的决定是动态的,并且基于客户端的策略,因此不能在 web.xml 中静态配置。
有没有办法动态触发 TLS 重新协商以从 servlet 中请求客户端证书?如果我可以访问原始 SSLSocket,那么我可以将其配置为需要客户端证书,然后调用startHandshake()来强制重新协商。据我所知,没有可移植的方法来获取与 servlet 请求/响应关联的 SSLSocket。
我的应用程序必须在各种 servlet 容器中运行,因此如果可能,我宁愿避免使用特定于容器的解决方案。理想情况下,解决方案不会涉及重定向,但如果这是唯一的方法,我会接受。
解决方案
你在上面的评论中写道:
因为该设置将导致 Web 浏览器提示用户选择一个证书,如果他们安装了一个与配置的 CA 之一匹配的证书。我从不希望 Web 浏览器客户端发生这种情况
然后我投票赞成这是不可能从服务器端实现的。TLS 先于通过安全通道发送的任何数据。您无法确定是网络浏览器还是不敲门而不询问客户身份。从 TLS 的角度来看,这只是另一个未命名的网络客户端尝试连接。建立安全连接后,发送数据,您可以确定这是不是浏览器。
您可能希望通过不同的端点管道浏览器(1 路 ssl)和服务器客户端(2 路 ssl)。
否则,您可能希望实现自己的 TLS 协议握手过程。
您可能希望将浏览器配置为不响应客户端证书请求,而不是配置服务器不询问是否(如果可能)确定这是基于浏览器的客户端。可能会尝试通过密码套装(支持的加密模式列表)来猜测它,但这绝对不是 servlet 级别的交互。
我很好奇有人知道如何解决你的问题。
推荐阅读
- python - 如何使用 selenium 和美丽的汤刮掉隐藏的类数据
- javascript - Node JS Express、Passport JS 和 Android 设备身份验证问题
- javascript - 如何检测某人何时使用javascript退出全屏?
- sql-server - SQL Server:使用存储过程根据特定条件动态更改订单序列
- android - 如何将 RoundCornerProgressBar 与 ButterKnife 绑定
- react-redux - 如何从 store.getState() 获取对象的不可变版本?
- linux - 如何从本地安装的 Ubuntu 访问我的 WSL2 文件?
- visual-studio-code - VS Code 文件资源管理器不会向上移动文件树 (Windows)
- graphql - 使用和组合另一个公共 apollo graphql api 的最佳方式:federation v 模式拼接
- ios - 如何循环播放 AVQueuePlayer