我们在 Java spring 框架上设置了一个 Web 门户。
它在 Apache Tomcat 应用服务器上运行。门户通过 Apache Web 服务器提供服务,该服务器通过 JK 连接器连接到 Tomcat。整个门户使用 Apache 的 443 端口启用 HTTPS。Apache 版本为:Apache/2.4.2 (Unix),这是本文发布时 Apache Web 服务器的最新稳定版本。
每当我们尝试将超过 128KB 的文件上传到门户时,我们都会遇到 413 错误:
Request Entity Too Large The requested resource /teamleadchoachingtracking/doFileUpload does not allow request data with POST requests, or the amount of data provided in the request exceeds the capacity limit.
在 apache 错误日志中我们收到以下错误:
AH02018: request body exceeds maximum size (131072) for SSL buffer
AH02257: could not buffer message body to allow SSL renegotiation to proceed
我们进行了 Google 搜索,有人建议将其设置SSLRenegBufferSize
为 10MB 等较高的值。根据这些建议,我们在 httpd 配置文件的虚拟主机部分中放入了以下条目:
<Directory "/teamleadchoachingtracking/doFileUpload/">
SSLRenegBufferSize 10486000
</Directory>
但错误仍然存在。
我们也没有SSLVerifyClient
具体说明,但重新谈判仍在进行中。
这是一个非常不一致且令人沮丧的错误。任何帮助都将不胜感激。提前致谢。
答案1
我通过在 Apache 文件中放入某些配置来解决这个问题httpd.conf
。以下是示例配置:
<Location "/calibration">
SSLRenegBufferSize 10486000
</Location>
之前我没有给出正确的配置。关键是精确的导致 HTTP 413 错误的 URL 位置。在 location 指令中需要提供准确的 URL 位置。
SSLRenegBufferSize
是指定发生重新协商时的最大缓冲区大小(以字节为单位)的参数。我将其设置为 10 MB。Apache 默认值为 128KB。
答案2
此问题发生在 SSL 重新协商期间。除了将 Apache 上的重新协商缓冲区大小设置为非常高的数字外,您还有其他一些选择:
- 配置您的(虚拟)主机仅使用单一身份验证方案,以避免重新协商
- 使用支持 HTTP 1.1 Expect Header 的客户端
答案3
据我在 ubuntu 14.04/apache 2.4 服务器上看到的那样,假设你正在使用.htaccess
apache 配置,该SSLVerifyDepth
参数还会触发 SSL 重新协商即使SSLVerifyClient
none
. 使用SSLVerifyDepth
配置行也会绕过SSLRenegBufferSize
值您可能已经为此目录及其所有子目录进行了设置。
SSLVerifyDepth
在每个服务器上下文中使用和在每个目录上下文中使用之间存在一些差异文档。因此,我认为这种有问题的行为与配置行相同<directory>
。仔细阅读后,文档还指出此参数将强制重新注册...
这个解决方案对我确实有用:
将其放在
SSLVerifyDepth
您的主配置ssl.conf
文件或虚拟主机配置文件中,SSLVerifyDepth 5
应该适合绝大多数主要证书提供商的证书链。将
SSLRenegBufferSize
所需大小放入.htaccess
或放入<directory>
每个目录的配置中。