什么导致来自WinHttpSendRequest的间歇性SEC_E_BUFFER_TOO_SMALL错误?

Nic*_*ith 5 c++ ssl https winhttp

我有一个工具,它针对具有相同标题,相同帖子正文等的相同URL 执行HTTP S POST命令,进行多次迭代.

我遇到的是,对于一些测试人员来说,WinHttpSendRequest()函数经常失败,随后对GetLastError()的调用返回此处记录的SEC_E_BUFFER_TOO_SMALL(0x80090321):COM错误代码(安全性和设置).

这不是WinHttpSendRequest()的文档错误代码,相当广泛的谷歌搜索没有发现任何东西.

我有四倍检查我提供的输入WinHttpSendRequest()是正确和有效的,并且这些输入连续工作了数万次......直到它没有.

我无法提供MVCE,但根据此处提供的假设,我正在寻找错误代码返回的任何可能原因.

Nic*_*ith 6

有人离线为我提供了答案,我觉得这很有趣。

在使用 RSA+ECDHE 的 TLS 1.2 中发生的密钥交换期间,ECDHE 的 256 字节(2048 位)公共模数整数是随机生成的,因此它偶尔会有高位字节为零。在这种情况下,正在使用的服务器(一些带有 OpenSSL 的 Linux 机器,不知道发行版或任何版本)使用 25 5字节而不是 256发送整数。

接收公共模数整数的 WinHTTP 代码显然没有正确处理它。值得注意的是,我还没有在所有软件更新的 Windows 7 上看到这个问题,但在 Windows 8 上经常看到它(Windows 10 尚未测试)。

Microsoft Edge 中的此错误报告确认了相同的行为,只是使用 1024 位模数而不是 2048,但可能是相同的问题:

具有 1024 DHE 的 TLS ServerKeyExchange 可能会将 dh_Y 编码为 127 字节,从而破坏 Internet Explorer 11

但是,它确实让我想知道 OpenSSL 是否应该填充整数。我还没有寻找实际的规范来了解在这种情况下允许的行为是什么。