使用 Java 和 ActiveDirectory 的 Kerberos 身份验证:KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN

使用 Java 和 ActiveDirectory 的 Kerberos 身份验证:KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN

我有一个 Java 应用程序,它使用 Kerberos 在 URL 下启用了 SSOhttp://alf-test.example.com/。不幸的是,有些东西不起作用,AD 说它不知道服务主体。这是 TGS-REQ 交换:

要求:

Kerberos TGS-REQ
Record Mark: 1499 bytes
    0... .... .... .... .... .... .... .... = Reserved: Not set
    .000 0000 0000 0000 0000 0101 1101 1011 = Record Length: 1499
Pvno: 5
MSG Type: TGS-REQ (12)
padata: PA-TGS-REQ
KDC_REQ_BODY
    Padding: 0
    KDCOptions: 40810000 (Forwardable, Renewable, Canonicalize)
    Realm: EESERV.LOCAL
    Server Name (Service and Instance): HTTP/alf-test.example.com
        Name-type: Service and Instance (2)
        Name: HTTP
        Name: alf-test.example.com
    till: 2037-09-13 02:48:05 (UTC)
    Nonce: 632225483
    Encryption Types: rc4-hmac rc4-hmac-old rc4-md4 des-cbc-md5 des-cbc-crc rc4-hmac-exp rc4-hmac-old-exp

回复:

Kerberos KRB-ERROR
Record Mark: 125 bytes
    0... .... .... .... .... .... .... .... = Reserved: Not set
    .000 0000 0000 0000 0000 0000 0111 1101 = Record Length: 125
Pvno: 5
MSG Type: KRB-ERROR (30)
stime: 2011-06-08 12:06:23 (UTC)
susec: 23385
error_code: KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN (7)
Realm: EESERV.LOCAL
Server Name (Service and Instance): HTTP/alf-test.example.com
    Name-type: Service and Instance (2)
    Name: HTTP
    Name: alf-test.example.com
e-data

但是,下面的方法可行:

kinit HTTP/alf-test.example.com

此外,当我希望 setspn 列出服务主体名称时,我得到了此输出,这对我来说看起来不错:

setspn -l test-alfrescohttp
Registered ServicePrincipalNames for CN=Alfresco-Test HTTP,CN=Users,DC=example,DC=com:
    HTTP/alf-test
    HTTP/alf-test.example.com

因此,服务主体似乎存在,但当浏览器首次访问主机时,我不断在 Wireshark 中看到 KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN 错误。我很困惑,这里可能出了什么问题?

谨致问候,迈克尔

答案1

KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN意味着 KDC 不知道谁持有 SPN,在你的情况下请求的 SPN 是HTTP/self-test.example.com

造成这种情况的两个常见原因是:

  1. Active Directory 林中的任何帐户都不存在 SPN(似乎不是您的情况)
  2. 有多个账户持有相同的 SPN(重复 SPN)

您可能在某处有重复的 SPN,因此两个或多个帐户持有相同的 SPN。

要检查 AD 林中哪些帐户持有 SPN,请运行以下命令:

setspn -Q HTTP/self-test.example.com

这将向您显示所有带有该 SPN 的帐户(如果有)。

*如果您希望使用通配符进行查询,则 (通配符) 也是有效的

例如 setspn -Q HTTP/self-test*

答案2

申请票Realm: EESERV.LOCAL
应该申请票Realm: EXAMPLE.COM

原因与来源相同Registered ServicePrincipalNames for CN=Alfresco-Test HTTP,CN=Users,DC=eeserv,DC=local:

假设服务主体存在于 AD 中并且配置正确,则更改它可能就足够了。不知道如何更改。

相关内容