Como obter o NegotiateStream para usar o Kerberos?

Depois de perguntaressa questãoEstou tentando usar o NegotiateStream para autenticar um cliente Windows em um servidor Java. Parece que o Java não tem grande suporte à biblioteca NTLM, então eu tenho trabalhado na suposição de que eu teria que usar o Kerberos, que o Java parece suportar muito melhor (via GSS-API).

O problema é que o NegotiateStream parece estar tentando usar o NTLM toda vez. A documentação sugere que ele poderia usar qualquer uma delas, mas não especifica como ela escolhe. Não consigo ver nenhuma opção na API para controlar qual mecanismo ela escolhe. Há algum caminho?

Eu tenho um Nome Principal de Serviço e meu código de cliente é assim:

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

No servidor final, o primeiro conjunto de bytes recebidos são 22,1,0,0,59 e, em seguida, "NTLMSSP" - o que eu não esperava.

Eu tentei alguns formatos diferentes para a seqüência de SPN, não tenho certeza qual é o formato correto. Eu criei originalmente o SPN com

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

setspn -L lista com sucesso como:

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

Estou fazendo algo errado ou entendendo completamente essas coisas? :)

questionAnswers(1)

yourAnswerToTheQuestion