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ń:

  1. Oblicz rozmiar tokenu Kerberos użytkownika przy użyciu formuły opisanej w następującym artykule:
    Problemy z uwierzytelnianiem Kerberos, gdy użytkownik należy do wielu grup

  2. Ustaw wartość MaxFieldLength i MaxRequestBytes 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

    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 usług IIS 6.0 i nowszych klucze rejestru MaxFieldLength i MaxRequestBytes znajdują się w następującym kluczu podrzędnym:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters

Ustaw wartości klucza, jak pokazano w poniższej tabeli:

Name (Nazwa) 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.

Name (Nazwa) Typ wartości: Value Data
MaxFieldLength DWORD 65536 (Dec) lub 10000 (Hex)
MaxRequestBytes DWORD 16777216 (Dec) lub 1000000 (Hex)

Ważna

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.

Informacje