我编写了一个与 RMI 远程通信的 Java 客户端和服务器(在 Win7 主机上)。我希望服务器对客户端用户进行身份验证,而客户端用户无需提供凭据(即单点登录)。为了利用 Window 的SSPI,我正在使用Waffle库。
- 服务器正在使用服务帐户dev\svc_serviceaccount在host1.dev.mydomain.com上运行
- 我为dev\svc_serviceaccount添加了一个 SPN, test/ host1.dev.mydomain.com
- 客户端以dev\testuser身份在host2.dev.mydomain.com上运行,并配置为使用上面的 SPN
- 客户端和服务器都配置为使用 Kerberos(非协商)SSPI 提供程序
一切都按预期工作,服务器成功验证了客户端,使用 Wireshark 我可以看到客户端和域控制器之间发送的 Kerberos 数据包。
接下来,我将服务器更改为作为不同的服务帐户 ( dev\svc_serviceaccount2 ) 运行。此服务帐户没有 SPN。客户端继续运行,并使用原始 SPN 进行配置。正如预期的那样,服务器现在无法对客户端进行身份验证。
最后,我将 dev\serviceaccount2 的密码更改为与dev\serviceaccount1相同,并按照上面的失败场景运行。除了现在服务器成功验证客户端!
我相信密钥来自密码哈希,但这仍然让我感到惊讶。谁能确认这是否是 SSPI 的预期功能?我正在尝试确定我的代码(或者华夫饼)是否存在问题。或者可能是环境因素导致了这种情况?任何帮助/解释将不胜感激。