Подтвердить что ты не робот

Простой клиент Kerberos в Java?

Приложения, такие как Google Chrome и IE, могут прозрачно обрабатывать аутентификацию Kerberos; однако я не могу найти "простое" решение Java для соответствия этой прозрачности. Все найденные решения требуют наличия файла krb5.conf и файла login.conf, который, по-видимому, требует от указанных выше приложений.

Каков наилучший способ создания приложения Java с возможностями SSO Kerberos, которые просто работают?

[update]: быть ясным Мне нужно CLIENT решение для создания билетов, не проверяя их. Кроме того, похоже, что SPNEGO является стандартным "обертковым" протоколом, который в конечном итоге делегирует Kerberos, но мне также нужно иметь возможность обрабатывать протокол SPNEGO.

4b9b3361

Ответ 1

Oracle имеет пример с использованием Java SaslClient. Я не программист на Java, но когда я однажды указал на это кому-то, кто смог, он смог быстро работать. Он может все еще нуждаться в файле "conf" где-то (n.b. Kerberos использует переменные среды, часто начиная с KRB5_, чтобы знать, где искать такие файлы). Также обратите внимание, что сам Kerberos не включает в себя транспорт любого вида - ваше приложение должно знать, как отправлять и получать полезные данные Kerberos так, как ожидает сервер (и это зависит от того, на каком сервере вы пытаетесь пройти аутентификацию).

Изменить: вы отредактировали свой вопрос, поэтому здесь ссылка, связанная с SPNEGO в Java, которая может быть полезной: http://download.oracle.com/javase/6/docs/technotes/guides/security/jgss/lab/part5.html

Ответ 2

Теперь для этого существует простое решение, используя Apache HTTP Components Client 4.5 или выше. Это по-прежнему отмечено как экспериментальное в 4.5, поэтому ваше перемещение может отличаться, но это работает отлично для меня в контексте предприятия.

В дополнение к клиентским баночкам HC 4.5 вам нужно будет использовать банки httpclient-win, jna и jna-platform на вашем пути к классам, как это предусмотрено http-компонентом-клиентом. Затем вы создаете HC-клиент с поддержкой Kerberos следующим образом:

CloseableHttpClient httpclient = WinHttpClients.createDefault();

Или используя построитель:

HttpClientBuilder clientBuilder = WinHttpClients.custom();

Что может быть настроено по мере необходимости перед созданием клиента:

CloseableHttpClient client = clientBuilder.build();

Это решение работает без какой-либо внешней конфигурации и, самое главное, решает проблему, когда встроенный механизм JRE ломается для пользователей с правами локального администратора в Windows 7+. Это возможно, потому что билет Kerberos извлекается непосредственно из SSPI API через JNA, а не через GSSAPI, предоставленный JRE.

Пример кода из команды http-components

Это стало возможным благодаря хорошей работе Даниэль Дубровкин Тимоти стена и Райан МакКинли

Ответ 3

На самом деле вам ничего не нужно. В Java 6 на клиентской машине Windows вы можете сделать это:

new URL("http://myhost/myapp").openStream();

И проверка подлинности только работает. По крайней мере, это для меня. И сервер, на котором я тестировал, поддерживает только Negotiate, а не NTLM auth.

Ответ 4

Добавление к David Roussels отвечает на специфическую проверку подлинности Kerberos на основе URL: -

Причина, по которой ваш код работает, заключается в том, что ваш целевой SPN (серверная сторона) настроен на HTTP/[email protected] В этом случае он будет работать, потому что вы явно не устанавливаете токен. URLConnection внутренне устанавливает токен с этим SPN

1 Выполните шаги (из моего предыдущего ответа), чтобы получить тему

2 Используйте контекст gss api init sec для создания токена контекста. На этом этапе существует множество обучающих программ.

3 База 64 кодирует токен

4 Прикрепите токен к подключению: -

URL url = new URL("http://myhost/myapp")
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection(); = 
urlConn.setRequestProperty("Authorization", "Negotiate " + encodedToken);

5 Внедрите привилегированное действие: -

//this internally calls the getInputStream
public class PrivilegedGetInputStream implements PrivilegedExceptionAction<InputStream>

6 Оберните все в Subject.doAs

//use prev answer instructions to get subject
Subject.doAs(subject, new PrivilegedGetInputStream(urlConnection)

Ответ 5

Вы можете использовать системные свойства вместо файлов конфигурации, чтобы указать имя и имя службы KDC, но эти вещи (по крайней мере) являются обязательными....

Ваффл фактически предоставит вам информацию, необходимую для установки большинства свойств, даже если она не получит вам билет. Посмотрите на класс WindowsAuthProviderImpl (файл справки Waffle.chm показывает API).

Я использую JAAS, чтобы получить билет на обслуживание из Active Directory в два этапа:

  • Используйте Krb5LoginModule для извлечения кэшированного TGT и добавьте его в тему.

  • Используйте объект Subject и GSS-API для извлечения сервисного билета из KDC.

Там много хорошего кода информации и примеров на "Путь к Active Directory в Интернете" .

Ответ 6

Хорошо, если вы хотите избежать использования файла login.conf, вам нужно ввести код иначе: -

//define your own configuration
import javax.security.auth.login.Configuration;
public class CustomLoginConfiguration extends Configuration

//pass certain parameters to its constructor
//define an config entry
import javax.security.auth.login.AppConfigurationEntry;
private AppConfigurationEntry configEntry;

//define a map of params you wish to pass and fill them up
//the map contains entries similar to one you have in login.conf
Map<String, String> params = new HashMap<String, String>();

//define the configuration
configEntry = new AppConfigurationEntry(
            "com.sun.security.auth.module.Krb5LoginModule",
            AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, params);

//implement getappconfig method
public AppConfigurationEntry[] getAppConfigurationEntry() {
    return new AppConfigurationEntry[] { configEntry };
}

Теперь, когда вы закончите с этим определением, вы можете использовать это, используя это, чтобы получать билеты из kdc

//get ticket in login context
LoginContext lc = null;
    lc = new LoginContext("lc", null, callback, new CustomLoginConfiguration(argumentlist));
    lc.login();

Теперь отсюда вы можете получить тему jaas и можете в основном сделать тонну аутентификации.

Если вам нужны дальнейшие указатели, просто оставьте комментарий.

Ответ 7

Используйте WAFFLE

Ответ 9

Я создал небольшой инструмент для упрощения подключения с httpclient к kerberos, вы можете попробовать. https://github.com/DovAmir/httpclientAuthHelper

DefaultHttpClient httpclient = new DefaultHttpClient();
AuthUtils.securityLogging(SecurityLogType.KERBEROS,true);
CredentialsUtils.setKerberosCredentials(client, new UsernamePasswordCredentials("xxx", "xxx"), "domain", "kdc");
client.executeMethod(httpget);