openssl接受连接使用我的缓冲区

时间:2016-12-28 22:22:37

标签: c++ openssl

正常:浏览器发送到我的代理:"连接... \ r \ n \ r \ n",代理发送" 200确定\ r \ n \ r \ n&#34 ;,浏览器发送加密请求,代理调用SSL_accept(套接字)。行。

问题:浏览器发送到我的代理服务器:" CONNECT ... \ r \ n \ r \ n" +下一个加密请求。代理发送" 200确定\ r \ n \ r \ n",调用SSL_accept(套接字)返回SSL_ERROR_SSL或SSL_ERROR_SYSCALL,因为代理读取加密请求的缓冲区部分。

解决方案:

  1. 使用recv(sock,buf,buffer_size,MSG_PEEK)和recv(sock,buf,used_size,0)。问题:所有数据都将被读取,或者在pool()中无限信号。

  2. 如何调用SSL_accept()将我的缓冲区与部分加密数据一起使用?

  3. 任何解决方案?

1 个答案:

答案 0 :(得分:1)

问题在于您的代理,而不是客户端。

根据CONNECT specification的第3.3节:

  

3.3。数据流水线

     

客户端在建立" 200连接之前发送一些用于服务器的数据是合法的。 (或任何其他成功或错误代码)。当用于远程服务器的任何握手数据可以在与代理请求相同的TCP数据包中发送时,这可以减少延迟并提高效率。这允许代理在建立与远程服务器的连接后立即转发数据,而无需等待客户端的两次往返时间(向客户端发送200;等待来自客户端的下一个数据包)。

     

这意味着代理服务器不能假设从中读取   客户端套接字描述符只返回代理请求。)相反,代理请求后可能存在任何数量的不透明数据,一旦建立连接,必须将其转发到服务器。但是,如果与远程服务器的连接失败,或者代理服务器不允许该连接,则代理将丢弃用于远程服务器的数据。

真正的错误是您的HTTP代理不应该开始调用SSL_accept(),因为它不是客户端TLS握手的目标。请求的服务器是目标,因此只有它才能正确响应握手。您的代理不得响应握手。它可能会导致客户端失败(特别是如果客户端正确地执行其工作以验证响应不是来自中间人)。

您的代理必须建立与所请求服务器的正常未加密连接,然后来回传递任何原始数据。您的代理不是客户端/服务器加密会话的参与者,它只是促进客户端和服务器之间数据交换的传递,仅此而已。

不要尝试以任何方式解释客户端或服务器的数据,而不是您要处理的数据。初始CONNECT请求之后的所有内容都不透明到代理,必须按原样转发。您不知道如何,也不能对客户端和服务器如何相互通信做出任何假设。