Ответы «HTTP 400 — ошибочный запрос (превышена допустимая длина заголовка запроса)» на HTTP-запросы

Если HTTP-запрос, требующий проверки подлинности Kerberos, отправляется на веб-сайт, размещенный в службах IIS и настроенный для использования проверки подлинности Kerberos, заголовок HTTP-запроса будет очень длинным. Эта статья поможет вам обойти ошибку HTTP 400, которая возникает, когда заголовок HTTP-запроса слишком длинный.

Оригинальная версия продукта: Windows Server 2016
Оригинальный номер базы знаний: 2020943

Симптомы

HTTP-запрос, для которого требуется проверка подлинности Kerberos, отправляется из браузера на веб-сайт, размещенный в службах IIS. Веб-сайт настроен для использования проверки подлинности Kerberos. Однако вместо получения ожидаемой веб-страницы отобразится сообщение об ошибке примерно такого содержания:

HTTP 400 — ошибочный запрос (превышена допустимая длина заголовка запроса)

Этот ответ может быть создан любым HTTP-запросом, который включает доступ к удаленному управлению Windows (WinRM).

Причина

Эта проблема может возникнуть, если пользователь является членом нескольких групп пользователей 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 — это размер маркера пользователя в байтах. HTTP кодирует маркер Kerberos с помощью кодировки base64.

    Примечание.

    Это приводит к замене каждых трех байтов в маркере четырьмя байтами в кодировке 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

Задайте значения ключей, как показано в следующей таблице:

Имя Тип значения Значение
MaxFieldLength DWORD (4/3 * T байт) + 200
MaxRequestBytes DWORD (4/3 * T байт) + 200

Вы также можете задать максимальные значения для разделов реестра, как показано в следующей таблице. Прежде чем вносить изменения в параметры реестра, учитывайте все возможные последствия для безопасности.

Имя Тип значения Значение
MaxFieldLength DWORD 65536 (десятичный формат) или 10000 (шестнадцатеричный формат)
MaxRequestBytes DWORD 16777216 (десятичный формат) или 1000000 (шестнадцатеричный формат)

Важно!

Изменение этих разделов реестра следует считать крайне опасным. Эти разделы позволяют отправлять HTTP-пакеты большего размера в IIS. Это, в свою очередь, может привести к тому, что Http.sys будет использовать больше памяти. Таким образом, такие изменения могут повысить уязвимость компьютера к вредоносным атакам.

Если для MaxFieldLength установлено максимальное значение 64 КБ, то для реестра MaxTokenSize должно быть задано значение 3/4 * 64 = 48 КБ. Дополнительные сведения о параметре MaxTokenSize см. в разделе Проблемы с проверкой подлинности Kerberos, возникающие в том случае, когда пользователь принадлежит к нескольким группам.

Ссылки