尝试归档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
似乎是对的。
[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调试选项:
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“吗?
发布于 2017-08-04 00:29:09
在你的问题中,你问了三个问题。我会处理每一个,并解释如何解决这一问题。看起来很简单。
答:我是global.lpl.top。这是正确编写的、完全限定的DNS域名,引用了您的域,它也是它的DNS域名,在用大写的时候也是Kerberos领域的名称(稍后我会讲到这一点)。Kerberos需要DNS才能正常工作,这意味着您不能在配置文件或keytab中将AD域名引用为“全局”。如前所述,您的Kerberos领域将正确地编写为GLOBAL.LPL.TOP,而这正是应该编码到您的keytab中的内容(我将在第3点中讨论这个问题)。您在整个过程中使用了缩短的名称“全局”,我强烈怀疑这就是Kerberos SSO无法工作的原因。
答:你可以把它留在那里。注意,即使您删除了它,它实际上仍然工作,因为Kerberos总是假定端口88是它的标准。但请注意:这个文件中的实际问题是,它需要反映完全限定的名称GLOBAL.LPL.TOP,而不是我们在第1点中提到的缩写名称。
回答:嗯,这将归结为实际解决问题。要做到这一点,在修复krb5.ini之后,您将需要使用正确的完全限定的Kerberos领域名称(即GLOBAL.LPL.TOP )重新生成keytab。因此,这两个单独的命令将如下所示,并按以下顺序运行:
首先运行以下命令:
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键标签的更多信息,请参见我的文章。看起来您缺少了一些与加密、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生成命令这样做,而不是您的系统管理。
https://stackoverflow.com/questions/45472685
复制相似问题