У нас возникают проблемы с получением аутентификации Kerberos / AD для работы с веб-приложением Spring, и я считаю, что проблема связана с типами шифрования для билетов Kerberos и функциональный уровень домена Active Directory.
Базовая установка:
У меня есть одна среда, в которой Active Directory Функциональный уровень домена - Windows Server 2003, и все работает нормально, с аутентификацией клиентов, как и ожидалось, если они вошли в домен. Используя kerbtray для проверки билетов в этой среде, я вижу, что все они имеют как тип шифрования билетов, так и тип шифрования ключей "RSADSI RC4-HMAC".
У меня есть новый домен с функциональным уровнем Windows Server 2008, и здесь проверка подлинности не работает. Ошибка приложения, возвращенная при попытке проверить билет:
Kerberos validation not successful...
Caused by: GSSException: Failure unspecified at GSS-API level (Mechanism level: Checksum failed)
at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Unknown Source)
at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
at sun.security.jgss.spnego.SpNegoContext.GSS_acceptSecContext(Unknown Source)
at sun.security.jgss.spnego.SpNegoContext.acceptSecContext(Unknown Source)
at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:146)
at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:136)
... 34 more
Caused by: KrbException: Checksum failed
at sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(Unknown Source)
at sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(Unknown Source)
at sun.security.krb5.EncryptedData.decrypt(Unknown Source)
at sun.security.krb5.KrbApReq.authenticate(Unknown Source)
at sun.security.krb5.KrbApReq.(Unknown Source)
at sun.security.jgss.krb5.InitSecContextToken.(Unknown Source)
... 43 more
Caused by: java.security.GeneralSecurityException: Checksum failed
at sun.security.krb5.internal.crypto.dk.ArcFourCrypto.decrypt(Unknown Source)
at sun.security.krb5.internal.crypto.ArcFourHmac.decrypt(Unknown Source)
Трассировка стека показывает "ArcfourCrypto.decrypt", поэтому предположительно он обрабатывает билет Kerberos как RC4-HMAC. Снова используя kerbtray для проверки билетов, на этот раз на клиенте есть 2 билета для домена: krbtgt / .COM. Оба билета имеют тип шифрования ключа RSADS1 RC4-HMAC, один также имеет тип шифрования билета, но другой имеет "Kerberos AES256-CTS-HMAC-SHA1-96".
Я не знаю наверняка, что это причина проблемы, но это единственное различие, которое мне удалось найти в двух средах, которое могло бы объяснить исключение аутентификации. Я пробовал изменить политику шифрования AD, пробовал IE и Firefox и почти все остальное, что только мог придумать, но ничего не помогло.
Мы будем очень благодарны за любую помощь в решении этого вопроса. Я бы предпочел исправить это на стороне Java, поскольку я, вероятно, не могу слишком много диктовать настройку производственной AD.