Обнаружен дефектный токен - IWA с SPNEGO на tomcat

Я пытаюсь настроить SPNEGO r7 с Tomcat 7.0.54, но при вызове request.getRemoteUser()

из JSP я получаю ошибку ниже:

SEVERE: Servlet.service() for servlet [ssoServlet] in context with path [/rightitnow] threw exception [GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)] with root cause
GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
        at sun.security.jgss.GSSHeader.<init>(GSSHeader.java:97)
        at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:306)
        at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285)
        at sun.security.jgss.spnego.SpNegoContext.GSS_acceptSecContext(SpNegoContext.java:871)
        at sun.security.jgss.spnego.SpNegoContext.acceptSecContext(SpNegoContext.java:544)
        at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:342)
        at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285)
        at net.sourceforge.spnego.SpnegoAuthenticator.doSpnegoAuth(SpnegoAuthenticator.java:444)
        at net.sourceforge.spnego.SpnegoAuthenticator.authenticate(SpnegoAuthenticator.java:283)
        at net.sourceforge.spnego.SpnegoHttpFilter.doFilter(SpnegoHttpFilter.java:229)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at com.rivermuse.server.filter.GWTCacheControlFilter.doFilter(GWTCacheControlFilter.java:43)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

Я видел сообщения здесь http://sourceforge.net/p/spnego/discussion/1003769/thread/990913cc/ Ошибка "Обнаружен дефектный токен" (NTLM не Kerberos) с Kerberos/Spring Security/IE/Active Directory

но я до сих пор не могу понять, в чем проблема.

Tomcat работает на Ubuntu 12.04 LTS, я использовал domainjoin-cli, чтобы добавить его в домен Windows. Я тестировал на разных клиентах (Firefox / IE / Chrome) в разных операционных системах (Windows XP, 7, 2008 Server, MacOS), и результаты отличаются для каждой комбинации, где некоторые комбинации дают ошибку выше, другие комбинации не предупреждают на всех, но все равно не удается получить getRemoteUser().

Выполняя предполетные проверки в http://spnego.sourceforge.net/pre_flight.html, я могу успешно запустить HelloKDC.

Я удостоверился, что IE включил IWA и что сервер beer.test.co.uk был в списке локальных сайтов интрасети и добавил его в network.negotiate-auth.trusted-uris в Firefox.

Я проверил DNS вперед / назад, как рекомендовано одним сообщением об этой проблеме, но у меня есть следующее:

rabbit-stew:logs $ host beer.test.co.uk
beer.test.co.uk is an alias for beer.uk.river.com.
beer.uk.river.com has address 192.168.12.236
rabbit-stew:logs $ host 192.168.12.236
236.12.168.192.in-addr.arpa domain name pointer beer.uk.river.com.

dev@beer:~/deploy/conf$ cat jaas.conf 
com.sun.security.jgss.krb5.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    principal="HTTP/beer.rivertest.co.uk@TEST.CO.UK"
    useKeyTab=true
    keyTab="/home/dev/deploy/conf/tomcat.keytab"
    storeKey=true;
};

com.sun.security.jgss.krb5.accept {
    com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    principal="HTTP/beer.test.co.uk@TEST.CO.UK"
    useKeyTab=true
    keyTab="/home/dev/deploy/conf/tomcat.keytab"
    storeKey=true;
};

dev@beer:~/deploy/conf$ cat krb5.ini 
[libdefaults]
default_realm = TEST.CO.UK
default_keytab_name = FILE:/home/dev/deploy/conf/tomcat.keytab
default_tkt_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
default_tgs_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
forwardable=true

[realms]
TEST.CO.UK = {
        kdc = vs5gen2.test.co.uk:88
}

[domain_realm]
test.co.uk= TEST.CO.UK
.test.co.uk= TEST.CO.UK

dev@beer:~/deploy/conf$ cat login.conf 
spnego-client {
    com.sun.security.auth.module.Krb5LoginModule required;
};

spnego-server {
    com.sun.security.auth.module.Krb5LoginModule required
    storeKey=true
    isInitiator=false;
};

Больше всего меня сбивает с толку то, что когда я запускаю один и тот же код на своем Mac, я могу работать в SSO.

Заранее спасибо и любые советы о том, где искать, чтобы исправить это, будет высоко ценится.

Редактировать: Исправлена ​​проблема с добавлением записи DNS A вместо псевдонима + получение билета Kerberos вручную на моем Mac с помощью kinit.

2 ответа

Я видел эту ошибку, когда Windows Client не отправил правильный служебный токен для запрошенной службы.

Например, служба была HTTP/server.example.com, но Windows отправляла билет службы для другой службы.

Используя Windows Client, проверьте с помощью утилиты 'kerbtray', что клиент действительно имеет служебный токен для службы HTTP/...

У вас проблема с DNS. Проверьте с вашим администратором.

Другие вопросы по тегам