我的客户要求我的基于 Linux 的 Web/应用程序服务器在 Windows 域中进行 SSO。服务器安装了自己的密钥表,一切运行正常。Windows 域 (EXAMPLE.ORG) 有一个与 SPN HTTP/server.example.org 关联的服务用户帐户。我的应用程序服务器 (WildFly) 要求 Kerberos 身份验证并拒绝 NTLM 身份验证。
我有一个使用默认设置创建的测试域(基于 2016)。我尝试在测试域中重复此设置,但无法使 Kerberos 正常工作。我看到来自服务器的协商请求,但客户端始终返回 NTLM 票证。
WWW-Authenticate: Negotiate (request)
Authorization: Negotiate TlRMTVNTU..... (reply)
在客户基础设施中,我看到 Kerberos 票证也存在同样的情况
WWW-Authenticate: Negotiate (request)
Authorization: Negotiate YIIHmAYGKw.... (reply)
我看到的唯一区别(除了 GPO)是我的 SPN 不在同一个 DNS 域内。我的 AD 域是 tdm.sample.org,服务器是 server.sample.org,我不知道这是否重要。
不久前,我在域中也遇到了同样的问题。IE 客户端和加入同一域的 IIS 的 Windows Server 2016 也都在使用 NTLM。
我相信很少有 GPO 设置来规范客户端如何授权或不授权,但我读过的所有文档都无济于事。
有没有清晰的描述 Kerberos 客户端身份验证有哪些限制,或者可以应用任何提示或调试策略?
答案1
当 Windows 甚至不尝试 Kerberos 授权时,存在一些限制。
1. SPN 指向 PTR,而不是 Web 别名
如果您的非域成员 Web 服务器有别名,则无需在该别名上分配 SPN。它将根据该服务器的真实 DNS 记录进行检查。
假设你有这个:
A record server.example.org -> 10.0.0.1
PTR record 10.0.0.1 -> server.example.org
CNAME record webapp.example.org -> server.example.org
访问webapp.example.org您不需要 SPNHTTP/webapp.example.org,你应该分配HTTP/服务器.example.org仅限服务记录。我认为如果没有 PTR 记录,它应该是一个 IP 地址。
2. 域成员不应被用其他名称来称呼。
我有一个启用了 IIS 和 Windows 集成身份验证的域成员服务器。由于我的网络设置,它在非域和域网络中都设置了 DNS:
srv.example.org -> 10.0.0.1
10.0.0.1 -> srv.example.org
并且它也注册了域名:
srv.tdm.example.org -> 10.0.0.1
如果以 srv.example.org 的身份访问此服务器,则不允许使用 Kerberos,只有以 srv.tdm.example.org 的身份访问时,Kerberos 才会起作用。即使通过 IP 地址访问,它也不会起作用。
我猜测这个事实的本质是由域中的 Windows 名称解析引起的,这通常发生在 DNS 之前。
我会继续寻找并更新这个答案。