Я работаю над проектом, в котором мы используем JAAS/Krb5LoginModule с useTicketCache и doNotPrompt, а также allowtgtsessionkey изменить реестр, чтобы использовать нашу аутентификацию при входе в Windows на компьютере, присоединенном к домену.
Затем мы используем jgss/kerberos для получения токена GSS API Kerberos (rfc1964), который мы используем для защиты сообщения SOAP с помощью профиля токена WSS Kerberos 1.1.1. при общении со службой. Это включает в себя включение токена GSS в кодировке b64 в элемент Security конверта/заголовка SOAP и использование sessionKey клиента/службы для подписи компонента элемента.
Мы получаем client/sessionKey, запрашивая частные учетные данные javax.security.auth.Subject, которые возвращает JAAS/Krb5LoginModule, и ищем javax.security.auth.kerberos.KerberosTicket, который соответствует имени однорангового узла нашей службы, и вызывая его getSessionKey. ().
Все это отлично работает в Java-6, однако клиенты Java-7 терпят неудачу, поскольку, похоже, произошли изменения в сообщении Kerberos KRB_AP_REQ, которое создает Java-7. Аутентификатор KRB_AP_REQ Java-7 содержит подключ, который отличается от sessionKey. Поскольку спецификация Kerberos (см. отрывок ниже) говорит, что этот подраздел заменяет sessionKey, наше поведение Java-6 с использованием sessionKey для подписи больше не является правильным.
RFC1510 — Служба сетевой аутентификации Kerberos (V5)
5.3.2. Аутентификаторы
subkey This field contains the client's choice for an encryption key which is to be used to protect this specific application session. Unless an application specifies otherwise, if this field is left out the session key from the ticket will be used.
Я нигде не видел, чтобы это изменение было задокументировано, но подтвердил поведение, по крайней мере, в Java(TM) SE Runtime Environment (сборка 1.7.0_11-b21).
На данный момент, если я не пропустил что-то явно очевидное (а я надеюсь, что пропустил), у нас есть варианты:
Измените конфигурацию Kerberos Java-7, чтобы вернуться к поведению Java-6 - к сожалению, я не видел в документах ничего, что могло бы предположить, что это возможно.
Найдите способ получить доступ к подразделу. Для этих вариантов, которые я изучил,
а. Расшифруйте токен GSS, закодированный b64, извлеките зашифрованный Authenticator, расшифруйте его с помощью sessionKey, декодируйте кодировку ASN.1 DER и извлеките подключаемый ключ.
б. Используйте то, что кажется нестандартным GSS API Extensions и используйте метод ExtendedGSSContext.inquireSecContext() с KRB5_GET_SESSION_KEY, чтобы получить подраздел.
Любые предложения/понимание этих или других возможных вариантов?