问题描述
在调用Azure Function的HTTP Trigger的时候,发送POST请求,遇见一个奇诡的现象。同一个API请求,时不时就遇见403报错,并且请求的返回时空,Response Header信息也非常的少。
如此情况,是什么原因呢?
问题解答
经过多方对比后,发现只有在请求的Body大于100KB的时候,才会触发403.72错误。
经过互联网搜索资料并验证后,定位到问题是由于启用了“Client Certificate mode”为“Optional Interactive User”(如设置为Required或Opetional效果均一样,默认值为Ignore)。
最后,根据实验,最快速的解决办法是把Client Certificate mode的值设置为 Ignore !
**原因分析 **
关于为何会出现Body大于100KB的情况会出现403报错的分析原因为:
使用 TLS 重新协商的客户端证书配置不支持包含大于 100 KB 的文件的传入请求。 此限制是由缓冲区大小限制引起的。 超过 100 KB 的任何 POST 或 PUT 请求都失败,并出现 403 错误。 此限制不可配置且无法提高。
HTTPS (TCP) 的底层协议会将大型数据包分解为多个帧。通常,这对应用程序来说不是问题,并且对客户端和服务器都是透明的。 因此,某些需要客户端证书的应用程序可能会遇到问题...
当初始数据被推送到多个帧中,并且 IIS 服务器在继续之前需要客户端证书时。 当数据开始从客户端流向服务器时(在 Server Hello 的初始 SSL 握手之后)并发送第一个数据包,您实际上可以在网络跟踪中看到这一点。服务器回复是客户端证书请求的开始,然后来自客户端的下一个数据包包含更多数据。此时,服务器会引发错误,因为它预期网络上的下一个数据是客户端证书。
对于较小的数据包,则不会发生这种情况,因为对 POST 或 PUT 的整个请求已经完成,服务器获得的下一个内容是客户端证书握手,而不是来自 PUSH 或 PUT 的其他数据
注:文档中提供了一种通过添加 Expect 请求头,并设置值为 100-Continue 并不能解决403问题。
【END】
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!