2009-09-30 53 views
4

this question后,我一直在尝试使用NegotiateStream反对Java服务器进行身份验证Windows客户端。看起来Java没有很好的NTLM库支持,所以我一直在努力假设我必须使用Kerberos,而Java似乎支持更好(通过GSS-API)。如何获得NegotiateStream以使用Kerberos?

问题是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字符串的几种不同格式,不知道什么是正确的格式。我最初创建SPN与

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

SETSPN -L成功将其列为:

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

我做得不对,或者完全误解这个东西? :)

+0

你在使用什么操作系统? – 2009-09-30 19:07:41

+0

另外,你用什么作为myServicePrincipalName? – 2009-09-30 19:15:14

+0

这是在Vista64上运行的。我对myServicePrincipalName tbh的正确格式有些困惑 - 我试过几个变种!我用这个创建了SPN: setspn -A TEST/<我的用户名> 我不知道如果这是正确的要么! :s具有注册SPN,我可以看看它与 SPN -L列出 TEST/<我的用户名> 。 鉴于这一点,我正在尝试“TEST/my-pc-name”,“TEST/my-user-name”以及那些带有域名的人。 显然很多猜测正在进行,我还没有找到很好的文档:( – 2009-09-30 19:30:12

回答

3

SPN名称的完整语法是<service>/<user>@DOMAIN;显然,可以省略域名。但是,如果用户名是my-pc-name.domain-name,那么您不应再缩短它 - 按照spn -L的名称给您提供SPN。

+0

哈,谢谢 - 这工程(只有当我使用。域名)所以具体而言,其工作方式的字符串看起来是这样的: TEST/ @ 我没想到尝试这种组合,因为它看起来那么多余的,但我想这是有道理的一点也没有。 “没有@DOMAIN科技工作和用户名似乎需要在它的域名了。 我明天早上更新的问题提SPN的东西。我是正确的思维那么氖如果给出有效的SPN,gotiateStream将仅使用Kerberos,并且如果不是则悄悄地回退到NTLM? 感谢您的帮助:) – 2009-09-30 21:16:59

+0

我的猜测是,它试图从KDC获取服务的门票。如果KDC不知道SPN,它将不会发出票据,然后又回到NTLM(实际上不需要“服务器名称”)。 – 2009-09-30 21:37:56