2009-09-30 7 views
4

Après avoir demandé this question, j'ai essayé d'utiliser NegotiateStream pour authentifier un client Windows par rapport à un serveur Java. Il semble que Java ne supporte pas bien la bibliothèque NTLM, donc j'ai supposé que je devais utiliser Kerberos, ce que Java semble bien mieux supporter (via l'API GSS).Comment obtenir NegotiateStream pour utiliser Kerberos?

Le problème est que NegotiateStream semble essayer d'utiliser NTLM à chaque fois. La documentation suggère qu'il pourrait utiliser l'un ou l'autre, mais ne précise pas comment il choisit. Je ne vois aucune option dans l'API pour contrôler le mécanisme qu'elle choisit. Y a-t-il un moyen?

J'ai eu moi-même un nom principal et mon code client ressemble à ceci:

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); 

Sur la fin du serveur, le premier ensemble d'octets reçus sont 22,1,0,0,59 et puis "NTLMSSP" - que je n'attendais pas.

J'ai essayé quelques formats différents pour la chaîne SPN, je ne sais pas quel est le bon format. Je créé à l'origine le SPN avec

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

SETSPN liste avec succès comme:

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

Est-ce que je fais quelque chose de mal, ou malentendu tout à fait ce genre de choses? :)

+0

Quel système d'exploitation utilisez-vous? –

+0

En outre, qu'utilisez-vous en tant que myServicePrincipalName? –

+0

Cela fonctionne sur Vista64 dès maintenant. Je suis un peu confus sur le bon format pour myServicePrincipalName tbh - J'ai essayé quelques variantes! J'ai créé le SPN avec ceci: setspn -A TEST/. Je ne suis pas sûr si c'est vrai non plus! : S Il a enregistré le SPN, et je peux le regarder avec spn -L qui énumère TEST/. Etant donné cela, j'essayais aussi "TEST/my-pc-name", "TEST/mon-nom d'utilisateur" et les deux avec le nom de domaine à la fin. Évidemment, beaucoup de conjectures se passe, je n'ai pas trouvé une grande documentation :( –

Répondre

3

La syntaxe complète d'un nom SPN est <service>/<user>@DOMAIN; Apparemment, il est possible d'omettre le nom de domaine. Toutefois, si le nom d'utilisateur est my-pc-name.domain-name, vous ne devez pas le raccourcir davantage - fournissez le SPN exactement comme spn -L vous le liste.

+0

Ha, merci - cela fonctionne (seulement si j'utilise le . ce nom de domaine) donc, concrètement, la chaîne qui fonctionne ressemble à ceci:. TEST/ @ Je ne pensais pas essayer cette combinaison car il a l'air si redondant, mais je suppose qu'il est logique il doesn. Ne pas travailler sans @DOMAIN et le nom d'utilisateur semble avoir besoin du nom de domaine à l'intérieur de celui-ci aussi Je vais mettre à jour la question demain matin pour mentionner les choses SPN. gotiateStream utilise Kerberos seulement si un SPN valide est donné, et revient tranquillement à NTLM sinon? Merci pour toute votre aide :) –

+0

Ma conjecture est qu'il essaie d'acquérir un ticket pour le service du KDC. Si le KDC ne connaît pas le nom principal de service, il n'émettra pas de ticket, puis il reviendra à NTLM (qui n'a pas besoin du "nom du serveur"). –

Questions connexes