1

一直在我的 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 时犯了一些错误?

谢谢,尼基尔

4

1 回答 1

0

在查看了您在 Chat 中写的内容以及完整的问题历史记录后,问题实际上是两个问题。(1) 在创建 keytab 之前,您需要始终删除正在使用的 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 用作目录服务时创建 keytab 的示例:Kerberos Keytabs – Explained。我还提供了每个 ktpass.exe 语法参数的随附说明。

为了帮助解决上述步骤后仍然可能出现的问题,然后使用 Notepad++(不是常规记事本)右键单击并编辑您的 keytab 文件,只需复制 keytab 文件的内容(不要进行任何更改),然后检查结果。里面的密钥会被加密——没关系,看看 SPN 是如何在 keytab 中制定的。它应该与 AD 帐户上的 SPN 显示的内容相匹配。当这些不匹配时,您将收到“在 Kerberos 数据库中找不到客户端”错误。还要确保应用程序服务器配置指向正确的密钥表文件,如果密钥表有任何更改,请重新启动应用程序服务。

于 2017-01-21T05:24:21.633 回答