Błąd HTTP 400 Nieprawidłowe żądanie (zbyt długi nagłówek żądania) odpowiada na żądania HTTP
Gdy żądanie HTTP wymagające uwierzytelniania Kerberos jest wysyłane do witryny internetowej hostowanej w usłudze Internet Information Services (IIS) i skonfigurowane do korzystania z uwierzytelniania Kerberos, nagłówek żądania HTTP będzie bardzo długi. Ten artykuł ułatwia obejście błędu HTTP 400 występującego, gdy nagłówek żądania HTTP jest zbyt długi.
Oryginalna wersja produktu: Windows Server 2016
Oryginalny numer KB: 2020943
Symptomy
Żądanie HTTP wymagające uwierzytelniania Kerberos jest wysyłane z przeglądarki do witryny internetowej hostowanej w usługach IIS. Witryna sieci Web jest skonfigurowana do używania uwierzytelniania Kerberos. Jednak zamiast oczekiwanej strony internetowej użytkownik otrzymuje komunikat o błędzie przypominający poniższy:
HTTP 400 — nieprawidłowe żądanie (nagłówek żądania jest za długi)
Taką odpowiedź może wygenerować każde żądanie HTTP obejmujące usługę Zdalne zarządzanie systemem Windows (WinRM).
Przyczyna
Ten problem może wystąpić, jeśli użytkownik jest członkiem wielu grup użytkowników usługi Active Directory.
Żądanie HTTP do serwera zawiera token Kerberos w nagłówku WWW-Authenticate
. Rozmiar nagłówka zwiększa się wraz z liczbą grup użytkowników. Jeśli rozmiar nagłówka lub pakietu HTTP przekracza limity skonfigurowane na serwerze, serwer może odrzucić żądanie i wysłać komunikat o błędzie jako odpowiedź.
Obejście 1: Zmniejszenie liczby grup usługi Active Directory
Zmniejsz liczbę grup usługi Active Directory, do których należy użytkownik.
Obejście 2: Ustawienie wpisów rejestru MaxFieldLength i MaxRequestBytes
Zwiększ ustawienia dla wpisów rejestru MaxFieldLength
i MaxRequestBytes
na serwerze, aby nagłówki żądań użytkownika nie przekraczały tych wartości. Aby określić odpowiednie ustawienia, użyj następujących obliczeń:
Oblicz rozmiar tokenu Kerberos użytkownika przy użyciu formuły opisanej w temacie Problemy z uwierzytelnianiem Kerberos, gdy użytkownik należy do wielu grup.
Ustaw wartość
MaxFieldLength
iMaxRequestBytes
na serwerze na 4/3 * T bajtów, gdzie T to rozmiar tokenu użytkownika w bajtach. Protokół HTTP koduje token Kerberos przy użyciu kodowania base64.Uwaga 16.
Spowoduje to zastąpienie każdych trzech bajtów w tokenie czterema bajtami zakodowanymi w formacie base64. Zmiany wprowadzone w rejestrze nie wejdą w życie do momentu ponownego uruchomienia usługi HTTP. Ponadto może być konieczne ponowne uruchomienie wszelkich powiązanych usług, takich jak usługi IIS.
W zależności od środowiska aplikacji można również obejść ten problem, konfigurując witrynę internetową do korzystania z uwierzytelniania Windows NT LAN Manager (NTLM) zamiast protokołu Kerberos. Niektóre środowiska aplikacji wymagają uwierzytelniania Kerberos do delegowania. Uważamy, że uwierzytelnianie Kerberos jest bezpieczniejsze niż NTLM. Zalecamy również, aby nie wyłączać uwierzytelniania Kerberos przed uwzględnieniem konsekwencji związanych z bezpieczeństwem i delegowaniem.
Więcej informacji
Domyślnie w rejestrze nie ma wpisu MaxFieldLength
. Ten wpis określa maksymalny limit rozmiaru każdego nagłówka żądania HTTP. Wpis MaxRequestBytes
rejestru określa górny limit całkowitego rozmiaru wiersza żądania i nagłówków. Zazwyczaj ten wpis rejestru jest konfigurowany razem z wpisem MaxRequestBytes
rejestru. Jeśli wartość MaxRequestBytes
jest niższa niż wartość MaxFieldLength
, wartość MaxFieldLength
jest dostosowywana. W dużych środowiskach usługi Active Directory użytkownicy mogą napotkać błędy logowania, jeśli wartości obu tych wpisów nie są ustawione na wystarczająco wysoką wartość.
W przypadku wersji usług IIS dostarczanych z systemem Windows Server 2016 lub nowszym MaxFieldLength
klucze rejestru i MaxRequestBytes
znajdują się w następującym podkluczu:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters
Ustaw wartości klucza, jak pokazano w poniższej tabeli:
Nazwisko | Typ wartości: | Value Data |
---|---|---|
MaxFieldLength | DWORD | (4/3 * T bajtów) + 200 |
MaxRequestBytes | DWORD | (4/3 * T bajtów) + 200 |
Można również ustawić klucze rejestru na ich maksymalne wartości, jak pokazano w następnej tabeli. Przed wprowadzeniem jakichkolwiek zmian w ustawieniach rejestru należy wziąć pod uwagę wszystkie potencjalne konsekwencje związane z bezpieczeństwem.
Nazwisko | Typ wartości: | Value Data |
---|---|---|
MaxFieldLength | DWORD | 65536 (Dec) lub 10000 (Hex) |
MaxRequestBytes | DWORD | 16777216 (grudzień) lub 1000000 (szesnastkowy) |
Ważne
Zmiana tych kluczy rejestru jest uważana za niezwykle niebezpieczną. Klucze te umożliwiają wysyłanie do usług IIS większych pakietów HTTP. To z kolei może spowodować, że skrypt Http.sys będzie używać większej ilości pamięci. W związku z tym takie zmiany mogą zwiększyć podatność komputera na złośliwe ataki.
Jeśli wartość MaxFieldLength
jest ustawiona na maksymalną wartość 64 KB, wartość rejestru MaxTokenSize
powinna być ustawiona na 3/4 * 64 = 48 KB. Aby uzyskać więcej informacji na temat ustawienia MaxTokenSize
, zobacz Problemy z uwierzytelnianiem Kerberos, gdy użytkownik należy do wielu grup.