После запроса this question, я пытался использовать NegotiateStream для проверки подлинности клиента Windows на сервере Java. Похоже, что Java не имеет большой поддержки библиотеки NTLM, поэтому я работал над предположением, что мне придется использовать Kerberos, которая, по-видимому, поддерживает Java (через GSS-API).Как заставить NegotiateStream использовать Kerberos?
Проблема в том, что NegotiateStream, кажется, пытается использовать NTLM каждый раз. Документация предполагает, что она может использовать либо, но не определяет, как она выбирает. Я не вижу никаких опций в API для контроля того, какой механизм он выбирает. Есть ли способ?
Я получил себе имя участника службы, и мой клиент код выглядит следующим образом:
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);
На стороне сервера, то первый набор байт поступающего 22,1,0,0,59 и затем «NTLMSSP» - чего я не ожидал.
Я пробовал несколько различных форматов для строки SPN, не уверен, что там правильный формат. Я изначально был создан SPN с
setspn -A <service-name>/<my-pc-name>.<domain-name> <my-user-name>
Setspn -L перечисляет его успешно, как:
TEST/<my-pc-name>.<domain-name>
Я делаю что-то неправильно, или полностью недопонимание этот материал? :)
Какую операционную систему вы используете? –
Кроме того, что вы используете в качестве myServicePrincipalName? –
Это работает на Vista64 прямо сейчас. Я немного запутался в правильном формате для myServicePrincipalName tbh - я пробовал несколько вариантов! Я создал SPN с этим: setspn -A TEST/. Я не уверен, что это так! : S Он зарегистрировал SPN, и я могу смотреть его с SPN -L <мой-User-Name> в котором перечислены TEST/. Учитывая, что я пытался «TEST/my-pc-name», «TEST/my-user-name» и оба из них с доменным именем на конце. Очевидно, что много догадок продолжается, я не нашел отличной документации :( –