我们有一个 Web 应用程序 + Node.js 服务器,受 mTLS 保护。客户提出了通过颁发具有不同权限的多个客户端证书来为用户分配角色的想法。实际上,当用户使用完其角色之一后,他希望单击“注销”的等效按钮,并再次看到浏览器选择的客户端证书。
TLSSocket.renegotiate
完美运行。我知道 TLS1.3 不可能开箱即用,到目前为止我们已尝试过:
resumeSession
处理程序,回调错误和空会话OCSPRequest
处理程序并模拟撤销。我们只返回错误。在 TypeScript 中不可能返回 null Buffer,这可能是 Node.js 类型中的一个错误。不。 3 和 4 会导致浏览器网络检查器中可见奇怪的失败请求,但没有 HTTP 响应。这可能意味着 TLS 级别确实发生了一些事情,但它无论如何都不会调用证书选择对话框。
到目前为止,我们想到的唯一方法是使用浏览器隐身模式并通过关闭它来“注销”。但隐身模式是被客户IT部门禁止的。
从积极的一面来看,我们拥有一种不寻常的力量。该应用程序一次只允许一个客户端(不要询问),因此我们甚至可以在注销后完全重新启动网络服务器。但是,如果我们手动模拟,它将继续使用之前使用的证书 - 没有选择。
就我对 TLS 1.3 的研究而言,有一种叫做“握手后身份验证”的东西,但据报道它在 Node.js 中没有实现,因为它在 HTTP/2 中是被禁止的。
有什么想法吗?
两个月的开发证据表明,在(node.js)服务器上通过自写逻辑重新协商 TLS1.3 是不可能的,在(Web 浏览器)客户端上更不可能。
启动重新协商的唯一方法是关闭已建立 TLS 会话的当前选项卡并打开新选项卡。 这可以是常规选项卡,而不仅仅是我原来问题中声称的私有选项卡 - Firefox 除外。即使在关闭的(常规)选项卡之间,Firefox 似乎也会记住 TLS 会话,并且原始声明适用。