无法获取Kerberos服务票证:KrbException:在Kerberos数据库中找不到服务器(7)

时间:2012-12-12 23:09:01

标签: active-directory kerberos

我正在使用GSSAPI进行开发,我的代码与vanilla MIT Kerberos 5服务器一起工作,可以完成一些客户端/服务器工作。我现在正在验证它对Active Directory的功能,我遇到了一个问题。

我的服务器经过身份验证和监听。我可以让客户登录。对于记录,这是基于http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html的代码。但是,我无法让客户端从AD获取故障单以获取它与服务器之间的会话。我得到KrbException:在Kerberos数据库(7)中找不到服务器,我无法弄清楚添加它的适当位置。我已经尝试将服务器名称与ip放在hosts文件中,更新dns,放入服务器记录等,没有运气。

如果有人知道更新AD以在Kerberos数据库中设置服务器的适当位置,那就太棒了!

9 个答案:

答案 0 :(得分:14)

此例外来自客户端,对吧? 请执行服务器主机名的正向和反向DNS查找。您的服务器的DNS条目不正确。它们对于Kerberos绝对至关重要。正确的位置是您的DNS服务器,在您的情况下:域控制器。找出DNS服务器的IP地址并联系您的管理员。另一种选择是缺少SPN,请检查它。

答案 1 :(得分:9)

我希望这会有所帮助..我收到了同样的错误消息(在Kerberos数据库(7)中找不到服务器)但这是在成功使用keytab登录后发生的。

当我们尝试使用凭据对AD进行LDAP搜索时,会出现错误消息。

这只是从java 1.6.0_34开始发生 - 它与我认为之前发布的1.6.0_31一起工作。 发生此错误是因为java不信任它与LDAP通信的KDC实际上是Kerberos领域的一部分。 在我们的例子中,我认为这是因为LDAP连接是通过循环解析查询找到的服务器名称。 也就是说,java解析了realm.example.com,但是获取了kdc1.example.com或kdc2.example .com ..etc中的任何一个。他们必须加强对这些版本之间的检查。

在我们的案例中,通过直接设置ldap服务器名称而不是依赖DNS来解决问题。

但调查仍在继续。

答案 2 :(得分:5)

在我的情况下,它是由所请求服务器地址的错误配置引起的。

服务器地址应为FQDN(完全限定的域名)。

Kerberos始终需要FQDN。

答案 3 :(得分:2)

这看起来像是一个缺少SPN的问题。您指向的网站

principal="webserver/bully@EXAMPLE.COM" 

这是获得票证的主体。您是否将此值更改为相对于AD域的值?

您可以使用命令行kerberos工具来测试您是否定义了SPN:

[root@gen-cs218 bin]# kinit Administrator
Administrator@SIGNING.TEST's Password:
[root@gen-cs218 bin]# kgetcred host/tcfe102@SIGNING.TEST
[root@gen-cs218 bin]# klist
Credentials cache: FILE:/tmp/krb5cc_0
        Principal: Administrator@SIGNING.TEST

  Issued                Expires               Principal <br>
Dec 15 11:42:34 2012  Dec 15 21:42:34 2012  krbtgt/SIGNING.TEST@SIGNING.TEST
Dec 15 11:42:48 2012  Dec 15 21:42:34 2012  host/tcfe102@SIGNING.TEST

基于主机名的SPN是预定义的。如果要使用未预定义的SPN,则必须使用setspn.exe工具在AD中明确定义它,并将其与计算机或用户帐户关联,例如:

c:\> setspn.exe -A "webserver/bully@MYDOMAIN" myuser

您可以使用以下命令检查SPN与哪个帐户相关联。这不会显示预定义的SPN。

c:\> setspn.exe -L "webserver/bully@MYDOMAIN"

答案 4 :(得分:1)

如果您已将SPN注册到多个用户/计算机,则可能会发生“Kerberos数据库中找不到服务器”错误。

您可以通过以下方式检查:

$ SetSPN -Q ServicePrincipalName
( SetSPN -Q HTTP/my.server.local@MYDOMAIN )

答案 5 :(得分:0)

sqlcmd有效,System.Data.SqlClient不起作用-在Kerberos数据库中找不到服务器。 您应该添加RestrictedKrbHost SPN

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/445e4499-7e49-4f2a-8d82-aaf2d1ee3c47

带有服务类的5.1.2 SPN等于“ RestrictedKrbHost”

支持“ RestrictedKrbHost”服务类的客户端应用程序在不具有服务身份但具有服务器名称的情况下,可以使用Kerberos身份验证。这不提供客户端到服务的相互身份验证,而是客户端到服务器的计算机身份验证。特权级别不同的服务具有相同的会话密钥,并且如果基础服务不能确保高级服务无法访问数据,则可以解密彼此的数据。

答案 6 :(得分:0)

在我的情况下,我的委托人是kafka/kafka.niroshan.com@NIROSHAN.COM,我在终端机中看到以下行:

>>> KrbKdcReq send: #bytes read=190
>>> KdcAccessibility: remove kerberos.niroshan.com
>>> KDCRep: init() encoding tag is 126 req type is 13
>>>KRBError:
         cTime is Thu Oct 05 03:42:15 UTC 1995 812864535000
         sTime is Fri May 31 06:43:38 UTC 2019 1559285018000
         suSec is 111309
         error code is 7
         error Message is Server not found in Kerberos database
         cname is kafka/kafka.niroshan.com@NIROSHAN.COM
         sname is kafka/kafka.com@NIROSHAN.COM
         msgType is 30

经过数小时的检查,我发现以下行在kafka_2.12-2.2.0/server.properties中有错误的值

listeners=SASL_PLAINTEXT://kafka.com:9092

我还获得了两个kafka.niroshan.comkafka.com的相同IP地址。

我将其更改为listeners=SASL_PLAINTEXT://kafka.niroshan.com:9092,然后它起作用了!

根据下面的链接,主体应包含每个主机的完全限定域名(FQDN),并且应与主体匹配。

https://docs.oracle.com/cd/E19253-01/816-4557/planning-25/index.html

答案 7 :(得分:0)

如果我告诉您当UPN的搜索未返回任何条目时表示我收到此错误,您将感到惊讶,这意味着未找到用户,因此没有获得明确的指示该查询不返回任何项目。 / p>

因此,我建议您修改查询部分或使用类似AdExpolorer的内容,以确保您正在使用的查询可以访问您正在寻找的用户/组(取决于您用作搜索sAMAccount属性的内容, userPrincipalName,CN,DN)。

此外,请注意,当您要连接的AD试图在您的计算机无法访问的另一个AD实例中查找该用户时,也会发生这种情况。

params.put(Context.REFERRAL, "follow");

答案 8 :(得分:-4)

考虑添加

[appdefaults]
validate=false

到你的/etc/krb5.conf。这可以解决DNS不匹配问题。