Ответы «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
на сервере, чтобы заголовки запросов пользователя не превышали эти значения. Чтобы определить соответствующие параметры, используйте следующие вычисления:
Вычислите размер маркера Kerberos пользователя с помощью формулы, описанной в следующей статье:
Проблемы с проверкой подлинности Kerberos, возникающие в том случае, когда пользователь принадлежит к нескольким группам.Задайте для
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, возникающие в том случае, когда пользователь принадлежит к нескольким группам.
Ссылки
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по