Jak uzyskać NegotiateStream do korzystania z Kerberos?
Po pytaniuto pytanie, Próbowałem użyć NegotiateStream do uwierzytelnienia klienta Windows na serwerze Java. Wygląda na to, że Java nie ma doskonałej obsługi bibliotek NTLM, więc pracowałem nad założeniem, że będę musiał używać Kerberosa, którego Java wydaje się obsługiwać znacznie lepiej (poprzez GSS-API).
Problem polega na tym, że NegotiateStream próbuje używać NTLM za każdym razem. Dokumentacja sugeruje, że może ona również zostać użyta, ale nie określa sposobu jej wyboru. Nie widzę żadnych opcji w interfejsie API, aby kontrolować, który mechanizm wybierze. Czy jest jakiś sposób?
Mam dla siebie główną nazwę usługi, a kod mojego klienta wygląda tak:
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);
Na końcu serwera pierwszy zestaw odebranych bajtów to 21,01,0,09, a następnie „NTLMSSP” - czego się nie spodziewałem.
Wypróbowałem kilka różnych formatów dla ciągu SPN, nie wiem, jaki jest właściwy format. Początkowo stworzyłem SPN za pomocą
setspn -A <service-name>/<my-pc-name>.<domain-name> <my-user-name>
setspn -L wyświetla go pomyślnie jako:
TEST/<my-pc-name>.<domain-name>
Czy robię coś złego lub całkowicie źle to rozumiem? :)