KDC_ERR_S_PRINCIPAL_UNKNOWN和KDC_ERR_PRINCIPAL_NOT_UNIQUE错误表示客户端正在请求访问 Kerberos 无法识别的服务。 此类错误表示以下一个或多个问题:
- 服务帐户未正确配置。
- 该服务未使用为其配置的服务帐户。
- 为服务配置了多个帐户。
- 客户端未正确请求服务。
每个服务都有一个服务主体名称(SPN),用于将其标识给客户端和其他服务。 SPN 是服务使用的 Active Directory 域服务 (AD DS) 帐户的属性。 服务可以在自定义服务帐户的上下文中运行,也可以在内置帐户的上下文中运行,例如本地计算机的计算机帐户。 该服务还可以在与计算机帐户(例如本地系统或网络服务)相关的安全上下文中运行。
配置 SPN 的方式因服务使用的帐户类型而异:
- 自定义服务帐户必须为每个使用该帐户的服务具有明确的 SPN。
- 计算机帐户可能具有为使用该帐户的服务配置的显式 SPN。 但是,常见服务类会自动映射到 HOST SPN。 为每个计算机帐户自动生成 HOST SPN。 在这种情况下,某些服务可能没有在计算机帐户上配置自己的 SPN。
重要
- 除非服务使用计算机帐户和 HOST SPN,否则 SPN 在 AD DS 林中必须唯一。 在多林环境中,SPN 必须在所有关联的林中是唯一的。
- 一个 SPN 只能与一个帐户相关联。 SPN 问题的常见原因是将服务配置为使用自定义帐户,即使 SPN 与自定义帐户和计算机帐户相关联。
收集跟踪数据并识别问题 SPN
如果尚未收集该问题的跟踪数据,请立即进行。 有关详细信息,请参阅 Kerberos 身份验证故障排除指南:3.收集跟踪和票证数据。 检查跟踪数据以查找客户端请求的 SPN。
检查服务帐户使用的 SPN
这些过程略有不同,具体取决于服务是使用自定义帐户还是计算机帐户。 下表汇总了差异。
服务使用自定义帐户 | 服务使用计算机帐户 |
---|---|
请求的 SPN 必须与帐户 SPN 匹配。 SPN 在林中必须是唯一的。 |
请求的 SPN 可能与其中一个帐户 SPN 匹配。 但是,常见服务(如 Web 服务)通常使用自动 HOST SPN 而不是唯一的 SPN。 如果帐户确实具有一个特定于服务的 SPN,则该 SPN 必须在整个林中是唯一的。 |
获取分配给服务帐户的 SPN 列表。 为此,请在域控制器上打开管理命令提示符窗口,然后运行以下命令:
setspn -L <Name>
注释
- 在此命令中, <Name> 表示运行服务的计算机或服务使用的自定义帐户的名称。
- 在多域环境中,使用 <Domain\Name> 格式指定帐户的域。
搜索使用请求的 SPN 的任何帐户。 此搜索标识任何重复的 SPN 或分配给错误帐户的 SPN。
注释
若要执行此过程,必须至少具有企业管理员权限。
若要确定与 SPN 关联的帐户或帐户,请打开管理命令提示符窗口,然后运行以下命令之一。
单林 多个受信任的林域 setspn -Q <SPN>
setspn -X <SPN>
注释
- 在此命令中, <SPN> 表示要搜索的 SPN。
- 在整个森林范围内搜索重复项可能需要很长时间,并消耗大量内存。
有关命令和可用选项的详细信息 setspn
,请参阅 setspn。
根据需要重新配置 SPN
后续步骤取决于跟踪数据的结果、 setspn
查询以及服务使用的帐户类型。
你可能会看到以下任何问题。
自定义帐户 | 计算机帐户 |
---|---|
服务帐户以外的一个或多个帐户具有 SPN。 | 计算机帐户以外的一个或多个帐户具有 SPN。 |
自定义帐户没有 SPN。 | 计算机帐户应具有 SPN,但它没有。1 |
自定义帐户的 SPN 不正确,或 SPN 与客户端请求的 SPN 不匹配。2 | 计算机帐户的 SPN 不正确或 SPN 与客户端请求的 SPN 不匹配。2 |
1 有关可以使用计算机帐户的 HOST SPN 的服务的列表,请参阅 setspn。 如果服务不是这些常见服务之一,则必须在计算机帐户上为该服务配置 SPN。
2 有关客户端请求信息,请参阅网络跟踪数据。
使用以下方法来修复 SPN 配置:
如果服务帐户配置正确,但客户端请求了不正确的 SPN,请参阅 修复不一致的 SPN。
如果正确的服务帐户具有 SPN 但 SPN 不正确,请删除不正确的 SPN,然后添加正确的 SPN。 有关详细信息,请参阅 从帐户中删除 SPN 并将 SPN 添加到服务帐户。
如果将 SPN 分配到除正确的服务帐户(自定义帐户或计算机帐户)以外的任何帐户,请从这些帐户中删除 SPN。 请参阅 从帐户中删除 SPN。
如果服务使用自定义帐户,但自定义帐户没有分配的 SPN,请添加 SPN。 有关详细信息,请参阅 向服务帐户添加 SPN。
如果服务使用计算机帐户,但不是本文中所述的常见服务之一, 请将 SPN 添加到 计算机帐户。
从帐户中删除 SPN
若要从帐户中删除 SPN,请在管理命令提示符处运行以下命令:
setspn -D <SPN> <AccountName>
注释
在此命令中, <SPN> 表示要删除的 SPN。 <AccountName> 表示要从中删除 SPN 的帐户(或其中一个帐户)。
将 SPN 添加到服务帐户
若要将 SPN 添加到帐户,请在管理命令提示符处运行以下命令:
setspn -S \<SPN> \<AccountName>
注释
在此命令中, <SPN> 表示要添加的 SPN。 <AccountName> 表示要向其添加 SPN 的帐户(或其中一个帐户)。
修复不一致的 SPN
确定 SPN 的版本正确:客户端请求的版本或服务帐户上配置的 SPN 版本。
如果客户端请求了不正确的 SPN,请验证客户端用于为请求生成 SPN 的信息,并确保源信息正确。 DNS 是此信息的常见来源。 除了 DNS 之外,其他客户端(尤其是非浏览器或自定义客户端)可能还使用其他源。
如果服务帐户使用不正确的 SPN,请 从服务帐户中删除 SPN,然后 添加正确的 SPN。
详细信息
SPN 使用 <ServiceClass>/<Host>:<Port>/,<ServiceName> 格式并包含以下组件:
- <ServiceClass> (必需) 表示服务的服务类。
- <主机> (必需)表示运行服务的计算机的名称。
- <端口> (可选)表示服务使用的端口号。
- <ServiceName> (可选)表示服务的名称。
有关如何设置 SPN 格式以及何时使用可选参数的详细信息,请参阅 唯一 SPN 的名称格式。