【发布时间】:2017-05-13 05:43:18
【问题描述】:
正常:浏览器发送到我的代理:“CONNECT...\r\n\r\n”,代理发送“200 OK\r\n\r\n”,浏览器发送加密请求,代理调用 SSL_accept (插座)。好的。
问题:浏览器发送到我的代理服务器:“CONNECT...\r\n\r\n”+ 下一个加密请求。代理发送“200 OK\r\n\r\n”,调用 SSL_accept(socket) 返回 SSL_ERROR_SSL 或 SSL_ERROR_SYSCALL,因为代理读取了加密请求的缓冲区部分。
解决方案:
使用 recv(sock, buf, buffer_size, MSG_PEEK) 和 recv(sock, buf, used_size, 0)。问题:将读取所有数据,或者 pool() 中的无限信号。
如何调用 SSL_accept() 将我的缓冲区与部分加密数据一起使用?
有什么解决办法吗?
【问题讨论】:
-
解决方案是修复有问题的客户端。在尝试协商 TLS 之前,客户端必须等待代理建立连接并发送“200 ok...”。客户端的代码坏了。
-
不要在空行之后读取任何内容,即使这意味着您必须一次读取一个字节:性能在这里并不重要。并确保在建立上游连接之前不发送 200 OK。
-
@SamVarshavchik 错误在代理端。允许客户端在收到
200回复之前发送数据。这在CONNECTspec 的Section 3.3 "Data Pipelining" 中有说明。代理不应首先调用SSL_accept(),因为它不是 TLS 握手的目标。它应该将原始数据按原样传递到下一个服务器。