HTTP 400 错误请求(请求标头过长)对 HTTP 请求的响应

本文帮助您解决在将需要 Kerberos 身份验证的超文本传输协议(HTTP)请求从浏览器发送到 Microsoft Internet information Services (IIS)上承载的网站并将其配置为使用 Kerberos 身份验证时发生的 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 以便用户的请求标头不会超过这些值。若要确定适当的设置,请使用以下计算:

  1. 使用在用户属于多个组时的 kerberos 身份验证问题中描述的公式计算用户的 Kerberos 令牌的大小。

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

    备注

    这会将令牌中的每三个字节替换为四个 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 及更高版本, MaxFieldLengthMaxRequestBytes 注册表项位于以下子项中:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters

按下表所示设置键值:

名称 值类型 数值数据
 MaxFieldLength  DWORD  (4/3 * T 字节) + 200
 MaxRequestBytes  DWORD  (4/3 * T 字节) + 200

您还可以将注册表项设置为它们的最大值,如下表中所示。 如果对注册表设置进行了任何更改,则应考虑所有潜在的安全后果。

名称 值类型 数值数据
 MaxFieldLength  DWORD  65536(Dec)或10000(十六进制)
 MaxRequestBytes  DWORD  16777216(Dec)或100000(十六进制)

重要

应认为更改这些注册表项是极其危险的。 这些密钥允许将较大的 HTTP 数据包发送到 IIS。 这反过来会导致 Http.sys 使用更多内存。 因此,此类更改可能会将计算机的漏洞提升为恶意攻击。

如果 MaxFieldLength 设置为其最大值为 64 kb,则 MaxTokenSize 应将注册表值设置为 3/4 * 64 = 48 KB。有关此设置的详细信息 MaxTokenSize ,请参阅当用户属于多个组时,使用 Kerberos 身份验证时遇到的问题

参考