当前位置: 首页 > 知识库问答 >
问题:

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

颛孙庆
2023-03-14

尝试在Tomcat 7(windows Server 2012)上归档集成的windows身份验证,以便Intranet用户在访问我的web应用程序时不需要输入他们的凭据。遵循tomcat手册:https://tomcat.apache.org/tomcat-7.0-doc/windows-auth-howto.html#Built-in\u Tomcat\u支持

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

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

域:global.lpl.top

gpresult /R

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

域名:GLOBAL

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

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

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

setspn-一个HTTP/tomcatserver.global.lpl。顶级tomcatuser

KTPass /outc:\tomcat.keytab /mapusertomcatuser@GLOBAL /princHTTP/tomcatserver.global.lpl.top@GLOBAL /passtomcatuserPassage /kvno0

现在我有了雄猫。keytab文件。

让我们验证一下。

1.

附言

这似乎是对的。

2.

jdk1.7.0_79\bin

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

[1] 服务主体:HTTP/tomcatserver.global.lpl.top@GLOBALKVNO: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

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

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

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

HTTP密码/tomcatserver.global.lpl.top@GLOBAL:tomcatserpassword异常:krb_错误6在Kerberos数据库中找不到客户端(6)在Kerberos数据库中找不到客户端KRBE异常:在sun.security.krb5.KrbAsRep.KrbAsRep.java:76)在sun.security.krb5.KrbAsReqBuilder.send(KrbAsReqBuilder.java:319)在sun.security.krb5.KrbAsReqBuilder.action(KrbAsReqBuilder.java:364)在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.krb5.internal.ASRep。(ASRep.java:60)at sun.security.krb5.krbas.代表。(KrbAsRep.java:60)…还有4个

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

jdk1.7.0_79\bin

感觉也不对。

还尝试使用SPNEGO过滤器在tomcat上运行测试应用程序,并在日志中获得以下异常:

严重:启动过滤器spnegohtpfilter javax.servlet时出现异常。ServletException:javax.security.auth.login。LoginException:在Kerberos数据库(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个答案

松英喆
2023-03-14

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

  1. 对于这两个不同的“域”值有点困惑。它是“global.lpl”吗。“top”或“GLOBAL”

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

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

答:好吧,这将实际上解决问题。要做到这一点,在您修复krb5.ini后,您需要使用正确的完全限定Kerberos领域名称GLOBAL. LPL. TOP重新生成keytab。在此之前,从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键表的更多信息,请参阅我的文章。看起来您缺少一些与加密相关的附加参数,ptype和 /kvno开关不是必需的,如果您使用它可能会导致问题。可以肯定的是,如果我是你,我会这样运行它:

ktpass-out c:\tomcat.keytab /mapUsertomcatuser@GLOBAL.LPL.TOPrndPass /mapOpset DumpSalt /cryptoAES256-SHA1-ptypeKRB5_NT_PRINCIPAL /princHTTP/tomcatserver.global.lpl.top@GLOBAL.LPL.TOP

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

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

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

 类似资料:
  • 我在W12服务器上运行了以下命令:- setspn-A HTTP/krbspn ktpass/princ HTTP/@/crypto ALL/ptype krb5\u nt\u principal/mapuser krbspn c:\ticket\krbspn。按键-kvno 0/pass Pa$$w0rd kinit-krbspn给出了正确的结果,但kinit-HTTP/返回:- KrbExce

  • 问题内容: 当使用node.js作为客户端时,是否可以使用Windows集成身份验证连接到服务器(例如,连接到IIS时)? 我对此的搜索仅显示将node.js用作服务器的结果。 问题答案: 2015更新: 现在有些模块实现了Windows集成的身份验证。 node- sspi 使用SSPI(Windows安全API)来处理服务器端的事务,但不执行client auth 。有几种客户端实现,例如ht

  • 我使用CAS和Spnego支持,KDC是192.168.1.244,我的领域是示例。COM我测试了我的本地Windows域环境,我可以从示例中获得票证。com我用“kinit”命令测试它,但在CAS spnego环境中,在Kerberos数据库中找不到异常客户端,我已经在C:\windows\krb5.ini中创建了它,内容如下 krb5.ini 异常报告如下: 但为什么在kerberos数据库中

  • 我正在运行一个squid代理服务器(CentOS 5),我正试图通过我们的AD服务器(Windows server 2008)使用kerberos。 我遵循了以下说明:http://wiki.squid-cache.org/ConfigExamples/Authenticate/Kerberos 为服务器设置一个keytab,这一切都运行良好。 当我尝试从客户端PC使用代理时,会出现问题,它会立即

  • 我正在尝试使用spnego和tomcat设置Kerberos集成Windows身份验证。 这是我第一次这样做,还没有看到真正的环境,所以依赖在线留档主要是spnego网站。我得到以下错误: GSSException:在GSS-API级别未指定故障(机制级别:无效参数(400)无法找到适当类型的密钥以使用HMAC解密AP REP-RC4) 附加我的krb5和login.conf。 krb5.conf

  • 任务:将Kerberos active directory身份验证添加到不安全的报告和数据操作桌面应用程序。此应用程序是。。。 用Stackless Python 2.7编写 使用Twisted进行客户端-服务器交互 客户端编译为exe并在Windows上运行 服务器在Linux(红帽)上运行 目前,我们从用户帐户中提取Windows网络ID(登录名)并传递到服务器,服务器会查找用户配置为具有的权