GSSException: у токена была проблема с недопустимой проверкой целостности

#java #ldap #kerberos #gssapi

#java #ldap #kerberos #gssapi

Вопрос:

Я столкнулся со странной проблемой с аутентификацией Kerberos / Ldap с использованием GSSAPI. У меня есть простой класс Java, который выполняет аутентификацию в Kerberos, а затем выполняет поиск Ldap.

Эта программа не работает на некоторых наших контроллерах KDC / AD с этим исключением:

 No encryption was performed by peer.
[stderr] javax.naming.AuthenticationException: GSSAPI [Root exception is javax.security.sasl.SaslException: Final handshake failed [Caused by GSSException: Token had invalid integrity check (Mechanism level: Corrupt checksum in Wrap token)]]
[stderr] 	at com.sun.jndi.ldap.sasl.LdapSasl.saslBind(LdapSasl.java:150)
[stderr] 	at com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:214)
[stderr] 	at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2694)
[stderr] 	at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:293)
[stderr] 	at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175)
[stderr] 	at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193)
[stderr] 	at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136)
[stderr] 	at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66)
[stderr] 	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
[stderr] 	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
[stderr] 	at javax.naming.InitialContext.init(InitialContext.java:223)
[stderr] 	at javax.naming.InitialContext.<init>(InitialContext.java:197)
[stderr] 	at javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:82)
[stderr] 	at com.ricoh.test.LdapGSSApiTest.search(LdapGSSApiTest.java:199)
[stderr] 	at com.ricoh.test.JndiAction.run(LdapGSSApiTest.java:440)
[stderr] 	at java.security.AccessController.doPrivileged(Native Method)
[stderr] 	at javax.security.auth.Subject.doAs(Subject.java:337)
[stderr] 	at com.ricoh.test.LdapGSSApiTest.search_gssapi(LdapGSSApiTest.java:189)
[stderr] 	at com.ricoh.test.LdapGSSApiTest.runTest(LdapGSSApiTest.java:111)
[stderr] 	at com.ricoh.test.ButtonTest$1.actionPerformed(ButtonTest.java:123)
[stderr] 	at jp.co.ricoh.dsdk.panel.Button.processActionEvent(Unknown Source)
[stderr] 	at jp.co.ricoh.dsdk.panel.Button.processEvent(Unknown Source)
[stderr] 	at jp.co.ricoh.dsdk.panel.Button.fire(Unknown Source)
[stderr] 	at jp.co.ricoh.dsdk.panel.Component$MultiEventHandlerImpl.exec(Unknown Source)
[stderr] 	at jp.co.ricoh.dsdk.core.manager.EventRunner$Dispatcher.processEvent(Unknown Source)
[stderr] 	at jp.co.ricoh.dsdk.core.manager.EventRunner$Dispatcher.run(Unknown Source)
[stderr] Caused by: javax.security.sasl.SaslException: Final handshake failed [Caused by GSSException: Token had invalid integrity check (Mechanism level: Corrupt checksum in Wrap token)]
[stderr] 	at com.sun.security.sasl.gsskerb.GssKrb5Client.doFinalHandshake(GssKrb5Client.java:310)
[stderr] 	at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:169)
[stderr] 	at com.sun.jndi.ldap.sasl.LdapSasl.saslBind(LdapSasl.java:114)
[stderr] 	... 25 more
[stderr] Caused by: GSSException: Token had invalid integrity check (Mechanism level: Corrupt checksum in Wrap token)
[stderr] 	at sun.security.jgss.krb5.WrapToken_v2.getDataFromBuffer(WrapToken_v2.java:257)
[stderr] 	at sun.security.jgss.krb5.WrapToken_v2.getData(WrapToken_v2.java:189)
[stderr] 	at sun.security.jgss.krb5.WrapToken_v2.getData(WrapToken_v2.java:164)
[stderr] 	at sun.security.jgss.krb5.Krb5Context.unwrap(Krb5Context.java:946)
[stderr] 	at sun.security.jgss.GSSContextImpl.unwrap(GSSContextImpl.java:384)
[stderr] 	at com.sun.security.sasl.gsskerb.GssKrb5Client.doFinalHandshake(GssKrb5Client.java:216)
[stderr] 	... 27 more  

Я запускаю Java 1.6 и отключаю тип шифрования RC4 на сервере.

У кого-нибудь есть идея, что может быть причиной этого? Любая известная проблема с JVM?

ПРИМЕЧАНИЕ: я могу правильно запустить программу на некоторых наших KDC и правильно выполнить поиск ldap.

Обновление: моя программа отлично работает с использованием JDK-8, поэтому я предполагаю, что это проблема, связанная с Java 1.6.

Комментарии:

1. Google это сообщение об ошибке. И вы обнаружите, что возможной причиной такого рода ошибок является то, что JVM Sun / Oracle по умолчанию не поддерживает AES128 или AES256 . Несмотря на то, что политика экспорта в США для технологии шифрования изменилась много лет назад, да. Вы должны загрузить JAR с подписью «unlimited strength encyption» отдельно. OpenJDK — это другая история.

2. Спасибо, Самсон, я знаю об этом… Я установил банки шифрования с неограниченной надежностью и установлены правильно. Но, интересно, что моя программа работает на JDK 1.8 и завершается сбоем на Java 1.6. и это похоже на проблему с JVM 1.6..

3. Действительно, были и будут проблемы — см. последнюю фразу в steveloughran.gitbooks.io/kerberos_and_hadoop/content/sections /…

4. Получите коммерческую поддержку от Oracle для Java 1.6 или выполните миграцию.