1

在 Windows 10 中使用 SChannel SSPI 执行 DTLS 握手时 - 没有文档 - 应用程序应如何处理来自 AcceptSecurityContext (ASC) 或 InitializeSecurityContext (ISC) 的 SEC_I_MESSAGE_FRAGMENT 结果?

我知道我打算将收到的片段发送给对方并再次调用 ASC/ISC 以获取下一个片段,但是当我再次调用 ASC 时,这次输入为空的 SECBUFFER_TOKEN,我在输出令牌缓冲区中什么也没有收到,并且它返回 SEC_I_MESSAGE_FRAGMENT - 表明它正在等待输入数据。

大概我没有成功地向 ASC 表明我希望它给我下一个片段,那么我该怎么做呢?

我创建了一个独立示例,在此 GitHub 要点中重现了我的问题: https ://gist.github.com/haddoncd/381c5e9542e977ca238ff16229bd9a0e/c881132ced94995402b617f38a5c8b6f8669b637

我还在程序的 gist 示例输出中包含了详细显示导致问题的输入: https ://gist.github.com/haddoncd/381c5e9542e977ca238ff16229bd9a0e/c881132ced94995402b617f38a5c8b6f8669b637#file-example_output-txt

4

2 回答 2

1

根据我的测试,您做的唯一错误的事情是context.handle在握手期间初始化后忘记重置。

isc_status = InitializeSecurityContextW(
    &creds,
    context.initialized ? &context.handle : nullptr,
    nullptr,
    context_reqs,
    0,
    SECURITY_NATIVE_DREP,
    isc_input_buffers,
    0,
    &context.handle, // HERE
    &out_buffer_desc,
    &context.attrs,
    &context.expiry
);

asc_status = AcceptSecurityContext(
    &creds,
    context.initialized ? &context.handle : nullptr,
    &in_buffer_desc,
    context_reqs,
    SECURITY_NATIVE_DREP,
    &context.handle, // HERE
    &out_buffer_desc,
    &context.attrs,
    &context.expiry
);

顺便说一句,您不需要调用DeleteSecurityContext旧的 CtxtHandle,因为它在调用后已无效。

于 2021-09-07T21:21:05.973 回答
0

关于您的实施的问题:我注意到您没有指定您正在使用的协议。

如 SCHANNEL_CRED文档中所述,您可以通过设置 schannel_cred.grbitEnabledProtocols = SP_PROT_DTLS1_2_CLIENT (或 1.1、服务器等)然后调用AcquireCredentialsHandle. 您如何验证使用 DTLS 的连接?文档说“如果此成员为零,则 Schannel 选择协议”。

于 2022-01-11T11:23:18.750 回答