5

问完这个问题后,我一直在尝试使用 NegotiateStream 针对 Java 服务器对 Windows 客户端进行身份验证。Java 似乎没有很好的 NTLM 库支持,所以我一直在假设我必须使用 Kerberos,Java 似乎支持得更好(通过 GSS-API)。

问题是 NegotiateStream 似乎每次都在尝试使用 NTLM。文档建议它可以使用任何一种,但没有指定它是如何选择的。我在 API 中看不到任何选项来控制它选择的机制。有办法吗?

我有一个服务主体名称,我的客户端代码如下所示:

string spn = "<service-name>/<my-pc-name>"
TcpClient client = new TcpClient(server, port);
NetworkStream stream = client.GetStream();
NegotiateStream neg = new NegotiateStream(stream, true);
neg.AuthenticateAsClient(CredentialCache.DefaultNetworkCredentials, spn);

在服务器端,收到的第一组字节是 22、1、0、0、59,然后是“NTLMSSP”——这是我没想到的。

我已经为 SPN 字符串尝试了几种不同的格式,但不确定正确的格式是什么。我最初用

setspn -A <service-name>/<my-pc-name>.<domain-name> <my-user-name>

setspn -L 成功将其列为:

TEST/<my-pc-name>.<domain-name>

我做错了什么,还是完全误解了这些东西?:)

4

1 回答 1

5

SPN 名称的完整语法是<service>/<user>@DOMAIN; 显然,可以省略域名。但是,如果用户名是my-pc-name.domain-name,那么您不应该进一步缩短它 - 提供与列表完全相同的 SPN spn -L

于 2009-09-30T19:56:37.167 回答