【Azure Function App】发现部分请求Function App遇见 403.72 报错(请求Body>100KB)

问题描述

在调用Azure Function的HTTP Trigger的时候,发送POST请求,遇见一个奇诡的现象。同一个API请求,时不时就遇见403报错,并且请求的返回时空,Response Header信息也非常的少。


image.png

如此情况,是什么原因呢?

问题解答

经过多方对比后,发现只有在请求的Body大于100KB的时候,才会触发403.72错误。

经过互联网搜索资料并验证后,定位到问题是由于启用了“Client Certificate mode”为“Optional Interactive User”(如设置为Required或Opetional效果均一样,默认值为Ignore)。

image.png

最后,根据实验,最快速的解决办法是把Client Certificate mode的值设置为 Ignore !

**原因分析 **

关于为何会出现Body大于100KB的情况会出现403报错的分析原因为:

使用 TLS 重新协商的客户端证书配置不支持包含大于 100 KB 的文件的传入请求。 此限制是由缓冲区大小限制引起的。 超过 100 KB 的任何 POST 或 PUT 请求都失败,并出现 403 错误。 此限制不可配置且无法提高。

参考信息:https://learn.microsoft.com/zh-cn/azure/app-service/app-service-web-configure-tls-mutual-auth?tabs=azureportal%2Cflask#upload-large-files-with-tls-renegotiation

HTTPS (TCP) 的底层协议会将大型数据包分解为多个帧。通常,这对应用程序来说不是问题,并且对客户端和服务器都是透明的。 因此,某些需要客户端证书的应用程序可能会遇到问题...

当初始数据被推送到多个帧中,并且 IIS 服务器在继续之前需要客户端证书时。 当数据开始从客户端流向服务器时(在 Server Hello 的初始 SSL 握手之后)并发送第一个数据包,您实际上可以在网络跟踪中看到这一点。服务器回复是客户端证书请求的开始,然后来自客户端的下一个数据包包含更多数据。此时,服务器会引发错误,因为它预期网络上的下一个数据是客户端证书。

对于较小的数据包,则不会发生这种情况,因为对 POST 或 PUT 的整个请求已经完成,服务器获得的下一个内容是客户端证书握手,而不是来自 PUSH 或 PUT 的其他数据

参考信息:https://learn.microsoft.com/en-us/archive/blogs/waws/posting-a-large-file-can-fail-if-you-enable-client-certificates#issue

注:文档中提供了一种通过添加 Expect 请求头,并设置值为 100-Continue 并不能解决403问题。


image.png

【END】

当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容