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

时间:2016-08-03 20:18:18

标签: c++ ssl https winhttp

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

我遇到的是,对于某些测试人员来说,WinHttpSendRequest()函数经常失败,随后对GetLastError()的调用将返回此处记录的SEC_E_BUFFER_TOO_SMALL(0x80090321):COM Error Codes (Security and Setup)

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

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

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

1 个答案:

答案 0 :(得分:4)

离线的人给我一个答案,发现它非常有趣。

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

以稍短的形式接收公共模数整数的WinHTTP代码显然无法正确处理它。值得注意的是,我还没有看到在Windows 7上使用所有软件更新重现此问题,但在Windows 8上经常看到它(Windows 10尚未测试)。

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

TLS ServerKeyExchange with 1024 DHE may encode dh_Y as 127 bytes, breaking Internet Explorer 11

然而,它确实让我想知道OpenSSL是否应该填充整数。我没有查看实际的规范,看看在这种情况下允许的行为是什么。