Tomcat集成了Windows身份验证:Kerberos数据库中找不到客户端

时间:2017-08-02 23:48:59

标签: tomcat kerberos

尝试在Tomcat 7(Windows Server 2012)上实现集成的Windows身份验证,以便Intranet用户在访问我的Web应用程序时不需要输入凭据。 关注tomcat手册:https://tomcat.apache.org/tomcat-7.0-doc/windows-auth-howto.html#Built-in_Tomcat_support

在运行tomcat的计算机上。 检查网络属性: 控制面板 - >系统

完整计算机名称:tomcatserver.global.lpl.top

域名:global.lpl.top

  

gpresult / R

组策略适用于:cdc.global.lpl.top

域名:GLOBAL

对这两个不同的"域"有点困惑。值。它是" global.lpl.top"或" GLOBAL"?

运行Tomcat的技术用户:tomcatuser,密码为tomcatuserpassword。

我让系统管理员调用两个命令:

  

setspn -A HTTP / tomcatserver.global.lpl.top tomcatuser

     

ktpass / out c:\ tomcat.keytab / mapuser tomcatuser @GLOBAL / princ HTTP/tomcatserver.global.lpl.top@GLOBAL / pass tomcatuserpassword / kvno 0

现在我有tomcat.keytab文件。

让我们验证。

1

  

PS> setspn -l tomcatuser已注册的ServicePrincipalNames   CN = tomcatuser,OU =服务,OU =帐户,OU = ...,OU =委托,DC =全球,DC = LPL,DC =顶部:           HTTP / tomcatserver.global.lpl.top

这似乎是正确的。

2

  

jdk1.7.0_79 \ bin> klist -kt C:\ tomcat.keytab

     

密钥选项卡:C:\ tomcat.keytab,找到1个条目。

     

[1]服务主体:HTTP / tomcatserver.global.lpl.top@GLOBAL            KVNO:0

似乎没错。

3。 创建krb5.ini文件:

[libdefaults]
default_realm = GLOBAL
default_keytab_name = FILE:C:\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]
GLOBAL = {
        kdc = cdc.global.lpl.top:88
}

[domain_realm]
global= GLOBAL
.global= GLOBAL
global.lpl.top= GLOBAL
.global.lpl.top= GLOBAL

那是什么":88" in" kdc = cdc.global.lpl.top:88"来自?我应该把它留在那里吗?

根据http://www.itadmintools.com/2011/07/creating-kerberos-keytab-files.html将krb5.ini文件放到c:\ Windows \ krb5.ini并使用kinit:

  

jdk1.7.0_79 \ bin \ kinit HTTP/tomcatserver.global.lpl.top@GLOBAL

     

HTTP /tomcatserver.global.lpl.top@GLOBAL的密码:   tomcatserpassword   例外:krb_error 6在Kerberos数据库中找不到客户端(6)   客户端未在Kerberos数据库中出现KrbException:找不到客户端   在Kerberos数据库中(6)           在sun.security.krb5.KrbAsRep。(KrbAsRep.java:76)           at sun.security.krb5.KrbAsReqBuilder.send(KrbAsReqBuilder.java:319)           at sun.security.krb5.KrbAsReqBuilder.action(KrbAsReqBuilder.java:364)           at sun.security.krb5.internal.tools.Kinit。(Kinit.java:221)           at sun.security.krb5.internal.tools.Kinit.main(Kinit.java:113)引起:KrbException:标识符与期望值不匹配(906)           at sun.security.krb5.internal.KDCRep.init(KDCRep.java:143)           at sun.security.krb5.internal.ASRep.init(ASRep.java:65)           at sun.security.krb5.internal.ASRep。(ASRep.java:60)           在sun.security.krb5.KrbAsRep。(KrbAsRep.java:60)           ......还有4个

现在有些不好。 并尝试使用keytab文件:

  

jdk1.7.0_79 \ bin> kinit -k -t C:\ tomcat.keytab   HTTP /tomcatserver.global.lpl.top@GLOBAL例外:krb_error 6客户端   在Kerberos数据库中找不到(6)客户端未在Kerberos中找到   数据库KrbException:在Kerberos数据库中找不到客户端(6)           在sun.security.krb5.KrbAsRep。(KrbAsRep.java:76)           at sun.security.krb5.KrbAsReqBuilder.send(KrbAsReqBuilder.java:319)           at sun.security.krb5.KrbAsReqBuilder.action(KrbAsReqBuilder.java:364)           at sun.security.krb5.internal.tools.Kinit。(Kinit.java:221)           at sun.security.krb5.internal.tools.Kinit.main(Kinit.java:113)引起:KrbException:标识符与期望值不匹配(906)           at sun.security.krb5.internal.KDCRep.init(KDCRep.java:143)           at sun.security.krb5.internal.ASRep.init(ASRep.java:65)           at sun.security.krb5.internal.ASRep。(ASRep.java:60)           在sun.security.krb5.KrbAsRep。(KrbAsRep.java:60)           ......还有4个

感觉不对。

还尝试在带有SPNEGO过滤器的tomcat上运行测试应用程序,并在日志中得到以下内容:

  

SEVERE:异常启动过滤器SpnegoHttpFilter   javax.servlet.ServletException:   javax.security.auth.login.LoginException:在Kerberos中找不到客户端   database(6)引起:KrbException:标识符不匹配   预期值(906)

我不介意看到它比较哪些标识符 - 任何想法如何做?

是的,在stackoverflow上有很多同类问题,但大多数都没有得到解答。我阅读了很多,但仍然无法在我的配置中看到错误。 将不胜感激任何帮助。 感谢。

编辑: 我在tomcat中添加了Kerberos调试选项:

2017-08-03 12:51:33 Commons Daemon procrun stdout initialized
Debug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt true
  ticketCache is null isInitiator true KeyTab is ///C:/tomcat7/conf/tomcat.keytab
  refreshKrb5Config is false principal is HTTP/tomcatserver.global.lpl.top@GLOBAL
  tryFirstPass is false useFirstPass is false storePass is false clearPass is false
>>> KeyTabInputStream, readName(): GLOBAL
>>> KeyTabInputStream, readName(): HTTP
>>> KeyTabInputStream, readName(): tomcatserver.global.lpl.top
>>> KeyTab: load() entry length: 72; type: 23
Java config name: C:\tomcat7\conf\krb5.conf
Loaded from Java config
Added key: 23version: 0
Ordering keys wrt default_tkt_enctypes list
default etypes for default_tkt_enctypes: 23 17.
>>> KdcAccessibility: reset
Added key: 23version: 0
Ordering keys wrt default_tkt_enctypes list
default etypes for default_tkt_enctypes: 23 17.
default etypes for default_tkt_enctypes: 23 17.
>>> KrbAsReq creating message
>>> KrbKdcReq send: kdc=cdc.global.lpl.top UDP:88, timeout=30000, number of retries =3, #bytes=150
>>> KDCCommunication: kdc=cdc.global.lpl.top UDP:88, timeout=30000,Attempt =1, #bytes=150
>>> KrbKdcReq send: #bytes read=84
>>> KdcAccessibility: remove cdc.global.lpl.top:88
>>> KDCRep: init() encoding tag is 126 req type is 11
>>>KRBError:
     sTime is Thu Aug 03 12:51:40 MSK 2017 1501753900000
     suSec is 36472
     error code is 6
     error Message is Client not found in Kerberos database
     realm is GLOBAL
     sname is krbtgt/GLOBAL
     msgType is 30
        [Krb5LoginModule] authentication failed 
Client not found in Kerberos database (6)

编辑2: 我要求系统管理员检查AD中的tomcatuser,其登录名仍然是" tomcatuser"。不应该改为" HTTP / tomcatserver.global.lpl.top@GLOBAL"?

1 个答案:

答案 0 :(得分:1)

在你的问题中,你提出了三个问题。我将解决每一个并解释如何解决这个问题。它看起来很简单。

  1. “对这两个不同的”域“值有点困惑。是”global.lpl.top“还是”GLOBAL“?”
  2. 答案:它是global.lpl.top。这是一个正确编写的,完全限定的DNS域名,指的是您的Active Directory域,它也是它的DNS域名,并且当用大写字母书写时也是Kerberos域名(我将在一秒内完成) 。 Kerberos需要DNS才能正常运行,这意味着您不能在配置文件或密钥表中将您的AD域名称为“GLOBAL”。如上所述,您的Kerberos领域将正确编写为GLOBAL.LPL.TOP,这应该已经编码到您的keytab中(我将在第3点讨论)。您在整个过程中使用了缩写名称“GLOBAL”,我强烈怀疑这就是Kerberos SSO无法正常工作的原因。

    1. “那是怎么回事”:88“in”kdc = cdc.global.lpl.top:88“来自哪里?我应该把它留在那里吗?”
    2. 答案:你可以留在那里。请注意,即使您删除它,它实际上仍然可以工作,因为Kerberos始终将端口88视为标准。但是注意:此文件中的实际问题是它需要反映完全限定名称GLOBAL.LPL.TOP - 而不是我们在第1点中讨论的缩写名称。

      1. “我不介意看到它比较哪些标识符 - 任何想法怎么做?”
      2. 答案:嗯,这可以归结为实际解决问题。为此,在修复krb5.ini之后,您需要使用正确的完全限定的Kerberos域名称GLOBAL.LPL.TOP重新生成密钥表。在此之前,请从tomcatuser AD帐户中删除SPN。因此,两个单独的命令将如下所示并按此顺序运行:

        首先运行:

        setspn -D HTTP/tomcatserver.global.lpl.top tomcatuser
        

        然后再运行。

        ktpass /out c:\tomcat.keytab /mapuser tomcatuser@GLOBAL.LPL.TOP /princ
        HTTP/tomcatserver.global.lpl.top@GLOBAL.LPL.TOP /pass
        tomcatuserpassword /kvno 0
        

        注意:有关如何正确创建Kerberos keytabs的更多信息,请参阅我的文章。看起来您缺少一些与加密相关的其他参数,ptype和/ kvno开关不是必需的,如果您使用它可能会导致问题。可以肯定的是,如果我是你,我会这样运行:

          

        ktpass -out c:\ tomcat.keytab / mapUser tomcatuser@GLOBAL.LPL.TOP   + rndPass / mapOp set + DumpSalt / crypto AES256-SHA1 -ptype KRB5_NT_PRINCIPAL / princ   HTTP/tomcatserver.global.lpl.top@GLOBAL.LPL.TOP

        编辑:(响应您刚刚注意到的编辑而制作)

        “编辑2:我要求系统管理员检查AD中的tomcatuser,其登录名仍为”tomcatuser“。是否应该更改为”HTTP/tomcatserver.global.lpl.top@GLOBAL“?”

        答案:否 - 因为keytab生成命令执行此操作。让keytab生成命令执行此操作,而不是系统管理员。