Недавно я написал фрагмент кода для JavaEE8, который аутентифицирует пользователей, запрашивая услуги у сервера приложений, используя Kerberos в домене Active Directory. Это включает в себя процесс, который использует файл keytab для аутентификации сервера по kd c целевого домена.
Все отлично работает при использовании текущих систем, но теперь я должен аутентифицировать сервер, используя работающий kd c на Windows 2008 Server.
Я некоторое время боролся с java.lang.RuntimeException: javax.security.auth.login.LoginException: Message stream modified (41)
и наконец понял проблему:
KD C на машине Windows 2008, очевидно, еще не поддерживает RF C 6806 - Раздел 11 FAST-схема (EN C -PA-REP флаг) и, следовательно, клиент не должен использовать kd c -option canonicalize=true
.
Хотя значение по умолчанию для canonicalize должно быть ложным ( в соответствии с Документация MIT Kerberos ) на самом деле он установлен на true все время при использовании машины windows в качестве клиента.
Это можно увидеть, отслеживая сетевой трафик c с помощью wireshark и просматривая AS-REQ в разделе req-body -> kd c -options -> canonicalize .
Интересно, что это только происходит в Windows. При использовании Linux в качестве клиента для canonicalize по умолчанию установлено значение false, и все работает просто отлично.
Я попытался добавить все найденные настройки, которые содержат любые ссылки на канонизацию, в krb5.conf , используемый моим клиентом, но на самом деле ничего не изменило канонизированный вариант kd c, как показано в AS-REQ.
Так что, похоже, в Windows есть определенная настройка, которая переопределяет канонизированный вариант kd c, чтобы он всегда был верным.
Если у кого-то есть идеи относительно того, что это может быть и как я могу изменить это поведение, я буду очень благодарен!
Вот как выглядит мой раздел libdefaults в krb5.conf:
[libdefaults]
default_realm = [our realm name]
dns_lookup = false
dns_lookup_kdc = false
dns_lookup_realm = false
default_tkt_enctypes = aes256-cts rc4-hmac
default_tgs_enctypes = aes256-cts
permitted_enctypes = aes256-cts
canonicalize = false
dns_canonicalize_hostname = false
rdns = false
РЕДАКТИРОВАТЬ: Я также попытался установить kdc_default_options = 0x00000000
в файле krb5.conf. Это значение, которое устанавливается по умолчанию при работе на Linux, тогда как на Windows оно всегда установлено на 00010000
. (Разница в том, что параметр canonicalize в опциях kd c установлен на true с 00010000
).
К сожалению, это ничего не изменило. Также не было добавления этого параметра с 00010000
к версии Linux. Это заставляет меня задаться вопросом, действительно ли эти параметры из krb5.conf даже используются.
Я знаю, что те, которые описывают домен, область, kd c и типы шифрования, фактически используются из этого файла, но остальные из них кажется, на самом деле не оказывает никакого влияния.
Есть ли у кого-нибудь опыт такого поведения?