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 的名称格式。