我正在运行Tomcat 8 Web服务器。我想强制用户使用Kerberos SSO身份验证。所以我禁用了服务器上的所有NTLM通信。
在我的调试环境中,使用this guide可以顺利运行。 当使用不同的域和服务器转移到我的生产时,身份验证失败。
在比较两个环境的客户端上的wireshark结果时,我注意到成功连接到服务器包含以下数据包:
HTTP GET (client -> sever)
HTTP 401 Unauthorized (server -> client) (WW-Authenticate: Negotiate)
AS-REQ (client -> DC)
KRB Error: KRB5KDC_ERR_PREAUTH_REQUIRED (DC -> client) (I understand that this is normal?)
AS-REQ (client -> DC)
AS-REP (DC -> client)
TGS-REQ (client -> DC)
TGS-REP (DC -> client)
在我的生产环境中,使用类似的客户端和服务器端配置(据我所知),客户端在AS-REP数据包之后停止,而不是立即请求带有TGS-REQ数据包的票证发送HTTP GET NTLMSSP_NEGOTIATE数据包
我找不到发生这种情况的原因。我比较了两个客户端之间的类似数据包,但我找不到任何差异。看起来客户端在从服务器接收到AS-REP后就放弃了,而不是请求kerberos票证,只是决定使用NTLM身份验证。
我打开了kerberos日志记录并且没有收到任何错误,AS-REP和NTLM请求之间没有数据包(除了向DC发送的TCP FIN数据包)
有谁知道什么可能导致这样的问题?我一直在寻找无处不在,似乎无法找到有关此问题的更多信息。
答案 0 :(得分:0)
KRB错误:KRB5KDC_ERR_PREAUTH_REQUIRED(DC - >客户端) - 这是正常的。这是因为默认情况下打开预身份验证以提高安全性。客户端首先在没有preauth的情况下发送AS-REQ,如果这样的请求被拒绝,则再次发送AS-REQ,而不是preauth。
当您修改配置时,例如要解决Kerberos问题,请记住在运行其他测试之前始终清除Kerberos缓存。否则,您会因为更改配置而感到沮丧,但无法看到效果 - 所有这些都是因为将使用缓存的Kerberos票证。您可以使用KerbTray清除缓存。
为何选择NTLM?因为AD无法找到请求SPN的用户。对于http服务器,它应该看起来像:HTTP / @ REALM。 AD必须找到一个用户,因为它需要他/她的密码来生成TGS。