HTTP的SSL重新协商工作流程

3
我有一个HTTP服务器,使用Java的NIO和SSL库编写,支持HTTP和HTTPS。在HTTPS模式下,它可以与或不与客户端证书通信。然而,我想执行重新协商。在这里,客户端将使用HTTPS连接,浏览资源,然后当他们访问高度安全的资源时,服务器会向客户端发出证书挑战。但是,我遇到了一些问题,需要知道工作流程应该是什么样子的。以下是我在IE 9和Chrome中观察到的情况:
1)当客户端请求安全资源时,我会完整地响应HTTP请求。然后,在完成后,我会向客户端发出证书挑战。
engine.setNeedClientAuth(true);  
engine.beginHandshake();

客户端发送TCP FIN(关闭连接),导致重新协商失败。
2)当客户端请求安全资源时,我会在响应之前要求证书。在这种情况下,交换发生了,两个浏览器都会弹出一个证书请求,但是一旦它弹出提示,客户端就会发送TCP FIN并且重新协商终止。然后客户端会发送另一个请求,其中最终包含了证书,有时我必须要求两次。
因此,我的问题是,应该发生什么?初始浏览器连接是否应该保持打开状态,还是像这样终止很正常?
注意:另一个非常有趣的观察结果是,在第二种情况下,当浏览器关闭TCP连接后,选择证书后会重新连接。但是,它不会重新发送请求,只是坐在那里等待服务器响应?在NIO术语中,它坐在OP_READ上等待,这意味着套接字输入缓冲区中没有数据。浏览器是否期望对其终止连接的原始消息进行响应??
奇怪的是,对于这个工作流程,绝对没有文档或规范,但是对于我测试过的所有浏览器,它们似乎都遵循这个工作流程。
1个回答

1

(1) 是不安全的,因此进一步讨论毫无意义。在请求凭证之前,您已经泄露了信息。

(2) 是正确的做法。如果配置允许重新协商,则客户端不应该关闭连接。由于去年或者几年前存在一个SSL安全问题,导致重新协商被默认禁止。你可能遇到了这个问题。在这种情况下,您应首先发出HTTP重定向,并在您的端点关闭连接以强制客户端使用新连接,而新连接应请求客户端证书。如何在代码中安排这个是由您决定的。


初始关闭实际上是工作流程的一部分,这样做是为了让浏览器弹出对话框,供客户端选择SSL证书,即使是符合RFC 5746的协商。当客户端再次连接时,它会进行正常的SSL握手,但不会交换证书,服务器必须通过第二个SSL hello请求来要求证书。在这第三次协商中,证书被交换。 - ng.
如果客户端不重新协商,那么这将行不通,除非第二个连接和挑战之间有另一个关闭。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接