gpt4 book ai didi

sspi - 在调用 InitializeSecurityContext 之前,SSL 握手中要从服务器接收多少数据?

转载 作者:行者123 更新时间:2023-12-02 02:35:21 27 4
gpt4 key购买 nike

在我们的 Windows C++ 应用程序中,我使用 InitializeSecurityContext() 客户端打开与运行 stunnel SSL 代理的服务器的 schannel 连接。我的代码现在可以工作,但只有我想消除的黑客攻击。

我从以下示例代码开始:http://msdn.microsoft.com/en-us/library/aa380536%28v=VS.85%29.aspx

在示例代码中,查看 SendMsg 和 ReceiveMsg。发送或接收的任何消息的前 4 个字节指示消息长度。这对于示例来说很好,其中示例的服务器部分符合相同的约定。

stunnel 似乎没有使用此约定。当客户端在握手期间接收数据时,它如何知道何时停止接收并再次调用InitializeSecurityContext()?

这就是我根据我从文档中收集到的内容构建代码的方式:

1. call InitializeSecurityContext which returns an output buffer
2. Send output buffer to server
3. Receive response from server
4. call InitializeSecurityContext(server_response) which returns an output buffer
5. if SEC_E_INCOMPLETE_MESSAGE, go back to step 3,
if SEC_I_CONTINUE_NEEDED go back to step 2

如果在步骤 3 中从服务器读取的数据不足,我预计步骤 4 中的 InitializeSecurityContext 将返回 SEC_E_INCOMPLETE_MESSAGE。相反,我得到 SEC_I_CONTINUE_NEEDED 但输出缓冲区为空。我尝试了几种方法来处理这种情况(例如返回步骤 3),但似乎没有一种方法有效,更重要的是,我没有看到这种行为的记录。

在步骤 3 中,如果我添加一个在超时到期之前接收数据的循环,则在我的测试环境中一切正常。但一定有更可靠的方法。

了解第 3 步中要接收多少数据的正确方法是什么?

最佳答案

SChannel 与协商安全包不同。您需要接收至少 5 个字节,这是 SSL/TLS 记录 header 大小:

struct {
ContentType type;
ProtocolVersion version;
uint16 length;
opaque fragment[TLSPlaintext.length];
} TLSPlaintext;

ContentType 是 1 个字节,ProtocolVersion 是 2 个字节,并且您有 2 个字节的记录长度。一旦您读取了这 5 个字节,SChannel 将返回 SEC_E_INCOMPLETE_MESSAGE 并准确地告诉您还需要多少字节:

SEC_E_INCOMPLETE_MESSAGE
Data for the whole message was not read from the wire.

When this value is returned, the pInput buffer contains a SecBuffer structure with a BufferType member of SECBUFFER_MISSING. The cbBuffer member of SecBuffer contains a value that indicates the number of additional bytes that the function must read from the client before this function succeeds.

一旦获得此输出,您就知道要从网络读取多少内容。

关于sspi - 在调用 InitializeSecurityContext 之前,SSL 握手中要从服务器接收多少数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6831493/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com