Kerberos SPN 被缓存在 Windows 服务器上?

Kerberos SPN gets cached on Windows Servers?

在我的 SSO 项目中集成了 Kerberos 身份验证。遇到一个奇特的场景。

我创建了一个新用户并附加了一个 SPN。按照 上的步骤进行操作,一切正常。我的意思是:-

  1. kinit 用户名 - 然后输入密码给了我票已保存的消息。
  2. kinit spn(int the format HTTP/FQDN) - 然后输入密码给了我勾选已保存的消息。

过了一段时间我决定再试一次,所以我使用了命令

setspn -D spn username

从用户名中分离 spn。然后我从AD中删除了这个用户(用户名)。

接下来我创建了一个新用户 username1 并按照 为这个新用户注册了与上述步骤相同的 spn。

现在 kinit username1 - 输入密码给出了票已保存的消息,但是 kinit spn - 输入密码给出了错误

client not found in Kerberos database.

请注意,如果我使用不同的(新)spn,一切正常。

所以问题是,Windows 服务器是否有某些缓存,其中一些链接仍然存在,因此我无法再次使用此 spn?还是我在从用户分离 spn 时犯了一些错误?

谢谢, 尼克尔

查看您在 Chat 中写的内容以及完整的问题历史记录后,问题实际上是两个问题。 (1) 在创建密钥表之前,您需要始终删除 in-use SPN。 (2) 在 ktpass.exe 密钥表创建命令中,您需要使用 HTTP/vinw12sec5225.eqsectest.local 的 SPN 映射用户,而不是短登录名 krbspn。另外,我只是做一个观察——您不需要将 SPN 全部大写。这使得它难以阅读,尽管为了连续性,我没有改变它。只有 Kerberos 领域应该全部大写。根据您提供的信息,要解决此案例,您应该执行以下命令:

  1. setspn -D HTTP/VINW12SEC5225.EQSECTEST.LOCAL krbspn
  2. ktpass /princ HTTP/VINW12SEC5225.EQSECTEST.LOCAL@EQSECTEST.LOCAL /ptype krb5_nt_principal /crypto All /mapuser krbspn@EQSECTEST.LOCAL /out c:\ticket\krbspn.keytab -kvno 0 /pass eQ@12345
  3. klist -e -k -t c:\ticket\krbspn.keytab

作为参考,我在此处展示了当 Microsoft Active Directory 用作目录服务时如何创建密钥表的示例:Kerberos Keytabs – Explained。我还提供了每个 ktpass.exe 语法参数的附带说明。

为了帮助解决上述步骤后仍然可能出错的问题,然后使用 Notepad++(不是常规记事本)right-click 并编辑您的 keytab 文件,只需复制 keytab 文件的内容(不要制作任何变化),然后检查结果。里面的密钥将被加密——没关系,看看密钥表中的 SPN 是如何制定的。它应该与 AD 帐户上为 SPN 显示的内容相匹配。当这些不匹配时,您将收到 "client not found in Kerberos database" 错误。还要确保应用程序服务器配置指向正确的密钥表文件,如果密钥表有任何更改,请重新启动应用程序服务。