Почему я получаю исключение GSSException при использовании единого входа Active Directory из Microsoft IE на сервер Java?

StackOverflow https://stackoverflow.com/questions/1785199

Вопрос

Я создавал систему аутентификации единого входа в Active Directory для веб-приложений Java (используя SPNEGO / Kerberos), и все отлично работает либо с Firefox, либо (по сообщениям) Safari, но Internet Explorer вызывает исключение:

GSSException: Channel binding mismatch (Mechanism level: ChannelBinding not provided!)

На самом деле, я думал, что IE работал до того, как был установлен патч Windows.

Это было полезно?

Решение

По-видимому, исправление KB974455 для Microsoft IE включило "Расширенную защиту" для встроенной проверки подлинности Windows.Обычно при проверке подлинности SPNEGO / Kerberos клиентский компьютер получает билет Kerberos / Active Directory для сервера и представляет этот билет во время согласования аутентификации HTTP.Начиная, по крайней мере, с версии Java 1.6, библиотека Java JGSS-API способна интерпретировать согласование SPNEGO / Kerberos и аутентифицировать тикет.

С помощью Расширенная Защита (см . также Расширенная защита для аутентификации), IE добавляет привязку канала к согласованию SPNEGO;на каких данных основана привязка канала, в настоящее время мне неизвестно, за исключением того, что идентификатор сеанса SSL, по-видимому, является его частью.Библиотека Java JGSS-API пытается проверить привязку канала и не может этого сделать без данных, на которых основана привязка.Затем он выдает исключение несоответствия привязки канала.

Проблема привела к некоторые интернет трафик, включая Идентификатор солнечного Жука 6851973.

Согласно комментариям, связанным с 6851973, RFC 4121, говорит,

Если вызывающий GSS_Accept_sec_context [RFC2743] передает в GSS_C_NO_CHANNEL_BINDINGS [RFC2744] в качестве привязок каналов, то принимающий МОЖЕТ игнорировать любые привязки каналов, предоставленные инициатором, возвращает успех, даже если инициатор действительно передал привязки канала.

и "все основные разработчики krb5 реализуют это "МОЖЕТ"".JGSS, по-видимому, требует, чтобы акцептор предоставил привязку канала, если инициатор представляет ее.Кроме того, исправление доступно в Java 7, сборка 64 и будет обратно перенесено на Java 5 и 6, хотя Java 6u18 не делает по-видимому, это так, как сообщалось в 6851973.

Обходной путь, как показано в Расширенная защита для аутентификации заключается в том, чтобы установить

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA\SuppressExtendedProtection

значение в реестре равно 0x02.Это отключает Расширенную защиту.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top