¿Cómo hacer que NegotiateStream use Kerberos?

Despues de preguntaresta pregunta, He estado tratando de usar NegotiateStream para autenticar un cliente de Windows contra un servidor Java. Parece que Java no tiene un gran soporte de biblioteca NTLM, así que he estado trabajando en el supuesto de que tendría que usar Kerberos, que Java parece soportar mucho mejor (a través de GSS-API).

El problema es que NegotiateStream parece estar intentando usar NTLM cada vez. La documentación sugiere que podría usar cualquiera de los dos, pero no especifica cómo elige. No puedo ver ninguna opción en la API para controlar qué mecanismo elige. ¿Hay alguna manera?

Tengo un nombre principal de servicio y mi código de cliente es así:

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

En el extremo del servidor, el primer conjunto de bytes recibidos son 22,1,0,0,59 y luego "NTLMSSP", que no esperaba.

He intentado algunos formatos diferentes para la cadena SPN, no estoy seguro de cuál es el formato correcto. Originalmente creé el SPN con

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

setspn -L lo lista exitosamente como:

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

¿Estoy haciendo algo mal o estoy malinterpretando completamente estas cosas? :)

Respuestas a la pregunta(1)

Su respuesta a la pregunta