2009-09-30 56 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