首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tomcat集成Windows身份验证: Kerberos数据库中找不到客户端

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

Stack Overflow用户
提问于 2017-08-02 23:48:58
回答 1查看 2.2K关注 0票数 1

尝试归档Tomcat 7 (Windows 2012)上的集成windows身份验证,以便Intranet用户在访问我的web应用程序时不需要输入他们的凭据。以下tomcat手册:support

在一台运行tomcat的电脑上。检查网络属性:控制面板->系统

计算机全名: tomcatserver.global.lpl.top

域: global.lpl.top

gpresult /R

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

域名:全局

对这两个不同的“域”值有点困惑。它是"global.lpl.top“还是”全局“?

有一个技术用户运行Tomcat: tomcatuser,密码是tomcatuserpassword。

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

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

现在我有了tomcat.keytab文件。

我们来核实一下。

1.

-l tomcatuser注册为CN=tomcatuser,OU=Services,OU=Accounts,OU=.,OU=Delegated,DC=global,DC=lpl,DC=top: HTTP/tomcatserver.global.lpl.top

这似乎是对的。

2.

jdk1.7.0_79\bin>klist -kt C:\tomcat.keytab 键选项卡: C:\tomcat.keytab,找到一个条目。 1服务主体: HTTP/tomcatserver.global.lpl.top@GLOBAL :0

似乎是对的。

  1. 创建krb5.ini文件:
代码语言:javascript
复制
[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

"kdc = cdc.global.lpl.top:88“中的":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@glob.top: tomcatserpassword异常:在Kerberos数据库中找不到krb_error 6客户端(6)在Kerberos数据库KrbException中未找到客户端d:在sun.security.krb5.KrbAsReqBuilder.action(KrbAsReqBuilder.java:364)的sun.security.krb5.KrbAsRep.(KrbAsRep.java:76)的Kerberos数据库(6)中未找到客户端在sun.security.krb5.internal.tools.Kinit.(Kinit.java:221) at sun.security.krb5.internal.tools.Kinit.main(Kinit.java:113)引起的: KrbException:标识符与sun.security.krb5.internal.KDCRep.init(KDCRep.java:143) at sun.security.krb5.internal.ASRep.init(ASRep.java:65) at sun.security的期望值(906)不匹配.krb5.internal.ASRep.(ASRep.java:60) at 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@全局异常:在Kerberos数据库中找不到krb_error 6客户端;(6) Kerberos数据库KrbException中未找到客户端d;.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:标识符与sun.security.krb5.internal.KDCRep.init(KDCRep.java:143) at sun.security.krb5.internal.ASRep.init的期望值(906)不匹配(ASRep)( sun.security.krb5.internal.ASRep.(ASRep.java:60) at sun.security.krb5.KrbAsRep.java:60.(KrbAsRep.java:60).

感觉也不太对劲。

还尝试使用SPNEGO过滤器在tomcat上运行一个测试应用程序,并在日志中得到以下例外:

严重:异常启动筛选器SpnegoHttpFilter javax.servlet.ServletException: javax.security.auth.login.LoginException: Client在Kerberos数据库(6)中找不到,原因是: KrbException:标识符与期望值(906)不匹配

我不介意看它比较哪些标识符--有什么办法吗?

是的,在堆叠溢出的问题上有很多相同的问题大多数都没有答案。我读了很多书,但仍然看不出我的心里话有什么错误。会很感激你的帮助。谢谢。

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

代码语言:javascript
复制
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“吗?

EN

回答 1

Stack Overflow用户

发布于 2017-08-04 00:29:09

在你的问题中,你问了三个问题。我会处理每一个,并解释如何解决这一问题。看起来很简单。

  1. 对这两个不同的“域”值有点困惑。它是"global.lpl.top“还是”全局“?

答:我是global.lpl.top。这是正确编写的、完全限定的DNS域名,引用了您的域,它也是它的DNS域名,在用大写的时候也是Kerberos领域的名称(稍后我会讲到这一点)。Kerberos需要DNS才能正常工作,这意味着您不能在配置文件或keytab中将AD域名引用为“全局”。如前所述,您的Kerberos领域将正确地编写为GLOBAL.LPL.TOP,而这正是应该编码到您的keytab中的内容(我将在第3点中讨论这个问题)。您在整个过程中使用了缩短的名称“全局”,我强烈怀疑这就是Kerberos SSO无法工作的原因。

  1. "kdc = cdc.global.lpl.top:88“中的”88“是从哪里来的?我应该把它留在那里吗?

答:你可以把它留在那里。注意,即使您删除了它,它实际上仍然工作,因为Kerberos总是假定端口88是它的标准。但请注意:这个文件中的实际问题是,它需要反映完全限定的名称GLOBAL.LPL.TOP,而不是我们在第1点中提到的缩写名称。

  1. “我不介意看它比较哪些标识符--有什么办法吗?”

回答:嗯,这将归结为实际解决问题。要做到这一点,在修复krb5.ini之后,您将需要使用正确的完全限定的Kerberos领域名称(即GLOBAL.LPL.TOP )重新生成keytab。因此,这两个单独的命令将如下所示,并按以下顺序运行:

首先运行以下命令:

代码语言:javascript
复制
setspn -D HTTP/tomcatserver.global.lpl.top tomcatuser

那之后再做这个。

代码语言:javascript
复制
ktpass /out c:\tomcat.keytab /mapuser tomcatuser@GLOBAL.LPL.TOP /princ
HTTP/tomcatserver.global.lpl.top@GLOBAL.LPL.TOP /pass
tomcatuserpassword /kvno 0

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

ktpass -out c:\tomcat.keytab /mapUser tomcatuser@GLOBAL.LPL.TOP +rndPass /mapOp set +DumpSalt /crypto美学256-SHA1 -ptype KRB5_NT_PRINCIPAL /princ tomcatuser@GLOBAL.LPL.TOP

编辑:(回应你的编辑,我刚刚注意到)

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

回答:不-因为keytab生成命令可以做到这一点。让keytab生成命令这样做,而不是您的系统管理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45472685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档