Wie bekomme ich NegotiateStream, um Kerberos zu verwenden?

Nach Rückfragediese FrageIch habe versucht, NegotiateStream zu verwenden, um einen Windows-Client gegen einen Java-Server zu authentifizieren. Es scheint, dass Java keine großartige NTLM-Bibliotheksunterstützung bietet. Daher bin ich davon ausgegangen, dass ich Kerberos verwenden muss, das Java anscheinend viel besser unterstützt (über die GSS-API).

Das Problem ist, dass NegotiateStream anscheinend jedes Mal versucht, NTLM zu verwenden. Die Dokumentation schlägt vor, dass es beide verwenden könnte, gibt jedoch nicht an, wie es auswählt. Ich kann keine Optionen in der API sehen, um zu steuern, welchen Mechanismus sie auswählt. Gibt es einen Weg?

Ich habe einen Service-Principal-Namen und mein Client-Code sieht folgendermaßen aus:

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

Auf der Serverseite sind die ersten empfangenen Bytes 22,1,0,0,59 und dann "NTLMSSP" - was ich nicht erwartet hatte.

Ich habe ein paar verschiedene Formate für die SPN-Zeichenfolge ausprobiert, nicht sicher, welches Format das richtige ist. Ich habe ursprünglich den SPN mit erstellt

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

setspn -L listet es erfolgreich auf als:

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

Mache ich etwas falsch oder verstehe ich dieses Zeug völlig falsch? :)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage