23

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

我的服务器已通过身份验证并正在侦听。我可以让客户端登录。作为记录,这是基于http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html的代码。但是,我无法让客户端从 AD 取回票证以获取它与服务器之间的会话。我得到 KrbException: Server not found in Kerberos 数据库 (7),我无法确定添加它的正确位置。我尝试将带有 ip 的服务器名称放在主机文件中,更新 dns,放入服务器记录等,但没有成功。

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

4

10 回答 10

19

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

于 2012-12-13T13:32:28.283 回答
14

我希望这会有所帮助.. 我收到了同样的错误消息(在 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 来解决的。

但调查仍在继续。

于 2013-04-13T12:22:25.070 回答
12

就我而言,这是由于请求的服务器地址配置错误造成的。

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

Kerberos 始终需要 FQDN。

于 2015-07-01T11:25:21.403 回答
4

这看起来像是缺少 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"
于 2012-12-15T19:56:01.623 回答
1

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 服务类等于“RestrictedKrbHost”的 SPN

支持“RestrictedKrbHost”服务类允许客户端应用程序在没有服务标识但有服务器名称时使用 Kerberos 身份验证。这不提供客户端到服务的相互身份验证,而是提供客户端到服务器的计算机身份验证。不同权限级别的服务拥有相同的会话密钥,如果底层服务不保证数据不能被更高级别的服务访问,则可以相互解密对方的数据。

于 2019-05-14T09:38:14.920 回答
1

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

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

$ SetSPN -Q ServicePrincipalName
( SetSPN -Q HTTP/my.server.local@MYDOMAIN )
于 2017-12-06T18:14:52.883 回答
0

In my case, My principal was kafka/kafka.niroshan.com@NIROSHAN.COM I got below lines in the terminal:

>>> 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

After hours of checking, I just found the below line has a wrong value in kafka_2.12-2.2.0/server.properties

listeners=SASL_PLAINTEXT://kafka.com:9092

Also I got two entries of kafka.niroshan.com and kafka.com for same IP address.

I changed it to as listeners=SASL_PLAINTEXT://kafka.niroshan.com:9092 Then it worked!

According to the below link, the principal should contain the Fully Qualified Domain Name (FQDN) of each host and it should be matched with the principal.

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

于 2019-05-31T07:14:03.773 回答
0

只是如果有人有类似的设置......

  1. 我在 Windows Server 19 下设置了一个 Windows 活动目录 (AD) 服务器,类似于本教程
  2. 并希望使用本教程对 Debian 客户端进行身份验证(使用 sssd) 。

我收到错误消息...

msktutil:GSSAPI 错误:未指定的 GSS 故障。次要代码可能会提供更多信息(在 Kerberos 数据库中找不到服务器)

...当我尝试将我的客户端计算机作为计算机添加到 AD 时:

msktutil -N -c -b 'CN=COMPUTERS' -s DEBIAN/debian.ad.local -k my-keytab.keytab --computer-name DEBIAN --upn DEBIAN$ --server winserv19.ad.local --user-creds-only

可以通过以下方式修复错误:

  1. 当然,将 DNS 服务器 IP 添加到/etc/resolv.conf
  2. 在 DNS 服务器上添加反向查找区域(也在 Win Serv 19 上运行,在 AD DS 旁边) Windows Server 19 DNS 反向查找区域
  3. 在 win DNS 服务器上激活Update associated pointer (PTR) record正向查找条目中的选项 Windows Server 19 DNS A 记录 PTR 选项
于 2021-09-14T13:55:52.273 回答
0

如果我告诉您当 UPN 搜索未返回任何条目时收到此错误,您会感到惊讶,这意味着未找到用户,而不是明确指示查询未返回任何项目。

因此,我建议修改您的查询部分或使用 AdExplorer 以确保您正在查找的用户/组可以通过您正在使用的查询访问(取决于您用作搜索 sAMAccount、userPrincipalName、CN、DN 的属性) .

请注意,当您连接到的 AD 试图在另一个 AD 实例中查找该用户时,您的机器无法通过与该初始 AD 实例的连接设置来访问该用户时,也会发生这种情况。

params.put(Context.REFERRAL, "follow");
于 2020-09-13T22:47:47.417 回答
-5

考虑添加

[appdefaults]
validate=false

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

于 2014-03-19T13:56:17.167 回答