如何等待整个缓冲区到达SSL连接

时间:2013-06-04 17:16:48

标签: ssl https winsock winsock2

我正在实现一个客户端服务器程序,其中客户端将HTTP消息发送到服务器。它可以是HTTP或HTTPS 在大型消息的情况下,例如使用HTTP进行文件传输,客户端一次性发送整个消息,而它以多个片段(网络执行)到达服务器。我等待整个消息来,并继续合并它,以便我得到整个消息。使用HTTP消息中发送的参数找到内容长度。 但是在HTTPS的情况下,无法知道enitre消息是否已到达。 如果我解密片段,它将返回垃圾值。我认为这是因为,在解密之前必须加入整个加密邮件。 如何识别整个消息是否已到达HTTPs 我正在使用SSL库并使用Windows套接字。

1 个答案:

答案 0 :(得分:2)

SSL将普通数据加密成块,然后将这些块单独传输到另一方。接收器需要读取原始套接字数据并在它到达时将其泵入SSL解密引擎。当引擎具有足够的字节用于给定块时,它解密该块并输出该块的纯数据。因此,您只需继续读取套接字数据并将其泵入解密引擎,缓冲输出的任何明确数据,直到遇到表示HTTP消息头结束的解密<CRLF><CRLF>序列,然后处理这些标头以确定是否HTTP消息体存在以及如何编码。如果存在消息体,请继续读取套接字数据,将其泵入解密引擎,并缓冲输出的纯数据,直到遇到消息体的末尾。 RFC 2616 Section 4.4 - "Message Length"描述了如何确定HTTP消息体的编码(在应用解密之后)以及什么条件终止消息体。

换句话说,您不应该查找加密套接字消息的结尾。在检测到解密的HTTP消息结束之前,您应该解密所有收到的内容。