HTTP 400 错误请求(请求标头太长)响应 HTTP 请求

阿里云服务器

当需要 Kerberos 身份验证的 HTTP 请求发送到托管在 Internet Information Services (IIS) 上并配置为使用 Kerberos 身份验证的网站时,HTTP 请求标头会非常长。本文可帮助您解决 HTTP 请求标头过长时发生的 HTTP 400 错误。

原始产品版本:   Windows Server 2016
原始 KB 编号:   2020943

症状

需要 Kerberos 身份验证的 HTTP 请求从浏览器发送到托管在 IIS 上的网站。该网站配置为使用 Kerberos 身份验证。但是,您没有收到预期的网页,而是收到类似于以下内容的错误消息:

HTTP 400-错误请求(请求标头太长)

任何包含 Windows 远程管理 (WinRM) 的 HTTP 请求都可以生成此响应。

原因

如果用户是多个 Active Directory 用户组的成员,则可能会出现此问题。

对服务器的 HTTP 请求在标头中包含 Kerberos 令牌WWW-Authenticate。标头大小会随着用户组数量而增加。如果 HTTP 标头或数据包大小超出服务器上配置的限制,服务器可能会拒绝该请求并发送错误消息作为响应。

解决方法 1:减少 Active Directory 组的数量

减少用户所属的 Active Directory 组的数量。

解决方法 2:设置 MaxFieldLength 和 MaxRequestBytes 注册表项

MaxFieldLength增加服务器上的和注册表项的设置MaxRequestBytes,以使用户的请求标头不超过这些值。要确定适当的设置,请使用以下计算

使用以下文章中描述的公式计算用户的 Kerberos 令牌的大小:
当用户属于多个组时,Kerberos 身份验证出现问题。

将服务器上的MaxFieldLength和的值设置为 4/3 * T 字节,其中 T 是用户的令牌大小(以字节为单位)。HTTP 使用 base64 编码对 Kerberos 令牌进行编码。MaxRequestBytes

 笔记

这会将令牌中的每三个字节替换为四个 base64 编码的字节。对注册表所做的更改只有在您重新启动 HTTP 服务后才会生效。此外,您可能必须重新启动任何相关服务,例如 IIS 服务。

根据您的应用程序环境,您也可以通过将网站配置为使用 Windows NT LAN Manager (NTLM) 而不是 Kerberos 来解决此问题。某些应用程序环境需要使用 Kerberos 身份验证进行委派。我们认为 Kerberos 身份验证比 NTLM 更安全。我们建议您在考虑安全和委派后果之前不要禁用 Kerberos 身份验证。

默认情况下,没有MaxFieldLength注册表项。此条目指定每个 HTTP 请求标头的最大大小限制。MaxRequestBytes注册表项指定请求行和标头的总大小的上限。通常,此注册表项与MaxRequestBytes注册表项一起配置。如果该MaxRequestBytes值低于该MaxFieldLength值,则MaxFieldLength调整该值。在大型 Active Directory 环境中,如果这两个条目的值未设置为足够高的值,用户可能会遇到登录失败。

对于 IIS 6.0 及更高版本,MaxFieldLength和MaxRequestBytes注册表项位于以下子项中:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters

设置键值如下表所示:

姓名值类型值数据
最大字段长度双字(4/3 * T 字节)+ 200
最大请求字节数双字(4/3 * T 字节)+ 200
姓名值类型值数据
最大字段长度双字65536(十进制)或 10000(十六进制)
最大请求字节数双字16777216(十进制)或 1000000(十六进制)

重要的

更改这些注册表项应被视为极其危险。这些项允许将更大的 HTTP 数据包发送到 IIS。这反过来可能会导致 Http.sys 使用更多内存。因此,此类更改会增加计算机遭受恶意攻击的脆弱性。

如果MaxFieldLength设置为其最大值 64 KB,则MaxTokenSize注册表值应设置为 3/4 * 64 = 48 KB。