我有一个HTTP服务器,使用Java的NIO和SSL库编写,支持HTTP和HTTPS。在HTTPS模式下,它可以与或不与客户端证书通信。然而,我想执行重新协商。在这里,客户端将使用HTTPS连接,浏览资源,然后当他们访问高度安全的资源时,服务器会向客户端发出证书挑战。但是,我遇到了一些问题,需要知道工作流程应该是什么样子的。以下是我在IE 9和Chrome中观察到的情况:
1)当客户端请求安全资源时,我会完整地响应HTTP请求。然后,在完成后,我会向客户端发出证书挑战。
客户端发送TCP FIN(关闭连接),导致重新协商失败。
2)当客户端请求安全资源时,我会在响应之前要求证书。在这种情况下,交换发生了,两个浏览器都会弹出一个证书请求,但是一旦它弹出提示,客户端就会发送TCP FIN并且重新协商终止。然后客户端会发送另一个请求,其中最终包含了证书,有时我必须要求两次。
因此,我的问题是,应该发生什么?初始浏览器连接是否应该保持打开状态,还是像这样终止很正常?
注意:另一个非常有趣的观察结果是,在第二种情况下,当浏览器关闭TCP连接后,选择证书后会重新连接。但是,它不会重新发送请求,只是坐在那里等待服务器响应?在NIO术语中,它坐在OP_READ上等待,这意味着套接字输入缓冲区中没有数据。浏览器是否期望对其终止连接的原始消息进行响应??
奇怪的是,对于这个工作流程,绝对没有文档或规范,但是对于我测试过的所有浏览器,它们似乎都遵循这个工作流程。
1)当客户端请求安全资源时,我会完整地响应HTTP请求。然后,在完成后,我会向客户端发出证书挑战。
engine.setNeedClientAuth(true);
engine.beginHandshake();
客户端发送TCP FIN(关闭连接),导致重新协商失败。
2)当客户端请求安全资源时,我会在响应之前要求证书。在这种情况下,交换发生了,两个浏览器都会弹出一个证书请求,但是一旦它弹出提示,客户端就会发送TCP FIN并且重新协商终止。然后客户端会发送另一个请求,其中最终包含了证书,有时我必须要求两次。
因此,我的问题是,应该发生什么?初始浏览器连接是否应该保持打开状态,还是像这样终止很正常?
注意:另一个非常有趣的观察结果是,在第二种情况下,当浏览器关闭TCP连接后,选择证书后会重新连接。但是,它不会重新发送请求,只是坐在那里等待服务器响应?在NIO术语中,它坐在OP_READ上等待,这意味着套接字输入缓冲区中没有数据。浏览器是否期望对其终止连接的原始消息进行响应??
奇怪的是,对于这个工作流程,绝对没有文档或规范,但是对于我测试过的所有浏览器,它们似乎都遵循这个工作流程。