Как люди заставляют Java-клиента SPNEGO работать в Windows?

Чтобы выполнить HTTP-аутентификацию SPNEGO на стороне клиента с помощью Java в Windows, необходимо установить ключ реестра Windows allowtgtsessionkey. Это хорошо задокументировано. Чего я не понимаю, так это как люди обходятся? Большинство корпоративных сайтов никогда не согласятся изменить этот раздел реестра в Windows ради одного программного обеспечения. Также подумайте о хлопотах, если это нужно изменить на каждой рабочей станции в организации. Но это только теория, потому что я до сих пор не смог убедить ни одного из наших клиентов изменить этот раздел реестра.

Я не виню их. Большинство корпоративных администраторов увидят, что это ослабляет безопасность, и поэтому будут возражать против этого.

Я прочитал это: Есть ли способ в Java или утилите командной строки, чтобы получить билет Kerberos для службы, использующей собственный API SSPI?

но сейчас оно довольно старое.

Так что я действительно, действительно не понимаю, как люди могут заставить Windows + Java-клиент + Kerberos работать на чем угодно, кроме университетской среды, домашних пользователей и тому подобное.

Вопрос, который я получаю от корпоративных администраторов, заключается в следующем: "Зачем нам устанавливать этот раздел реестра, если у таких приложений, как IE и Firefox, нет проблем с выполнением SPNEGO без установки этого ключа?". Ну, я знаю, что ответ. Это связано с тем, что (скорее всего) такие приложения, как IE и Firefox, основаны на собственном GSS API Windows (SSPI), а Sun Sun использует собственную реализацию.

Я предполагаю, что использование чего-то вроде WAFFLE решит проблему, но я бы предпочел чисто Java-решение. Я также предполагаю, что это не поможет использовать решения на основе Java, такие как Spring security или Apache HttpClient, поскольку все они будут страдать от этой проблемы.

Любая помощь или указатели будут с благодарностью.

ОБНОВЛЕНИЕ1:

Я обнаружил, что в базе данных ошибок Oracle есть RFE для этого. Есть также патч, представленный по этому вопросу сотрудником Oracle, и обсуждения в списке рассылки JDK об этой функции. Не делает меня намного мудрее, кроме того, насколько я могу понять, что это не доступно в текущей Java 7, даже как экспериментальный. Правильно?

ОБНОВЛЕНИЕ 2:

Теперь этот вопрос снова появился в списке рассылки OpenJDK Security Dev.

4 ответа

Решение

Спасибо за ссылку на мою ветку в списке рассылки security-dev;-) Моя среднесрочная цель - сделать этот патч доступным для Java 6+ через одобренный путь к классу. Вас может заинтересовать этот билет WAFFLE, который я недавно создал: https://github.com/dblock/waffle/issues/50

Я также оценил WAFFLE, но он не так похож на Java-GSS, что приходится создавать дубликаты кода, это то, чего я хочу избежать всеми средствами.

Вся эта проблема не совсем вина Oracle. Microsoft просто блокирует любой вызов билета сеанса через LSA CallPackage функция. Предлог - безопасность. Мне бы очень хотелось узнать, как SSPI может создать билет службы, когда я не могу получить доступ к TGT. Поэтому такое закрытое исходное решение - отстой.

Сейчас у вас есть только три варианта:

  1. Получить TGT снова через средства Java
  2. Попробуй вафлю
  3. Написать свой код

Я закопал дрянной ключ реестра, потому что он все равно не работает для локального администратора с учетными записями домена. В моем случае, Tomcat dev для Windows я использовал для вызова Java kinit.

Начиная с Java 13 теперь есть встроенная поддержка в собственном GSS API JDK для Windows (также известном как SSPI).

См. Примечания к выпуску для Java 13, а также JDK-6722928.

Теперь есть действительно хорошее решение для этого, включенное в HTTP-клиент Apache, использующее JNA для получения билета от собственного SSPI API. Смотрите этот ответ:

/questions/18623588/prostoj-klient-kerberos-v-java/18623630#18623630

Для тех, кто ищет простое решение с Java 8, Waffle - лучший выбор.

Код:

      import java.net.URI;
import java.util.Base64;

import waffle.windows.auth.IWindowsSecurityContext;
import waffle.windows.auth.impl.WindowsSecurityContextImpl;

public class KerberosCredentiels {

  /**
   * Generate current user token using Kerberos ticket
   */
  public String retrieveToken(URI uri) {
    IWindowsSecurityContext clientContext = WindowsSecurityContextImpl.getCurrent("Kerberos", convertToSPN(uri));
    byte[] token = clientContext.getToken();

    return Base64.getEncoder().encodeToString(token);
  }

  private static String convertToSPN(URI uri) {
    StringBuilder builder = new StringBuilder();

    builder.append("http/");
    builder.append(uri.getHost());

    return builder.toString();
  }

}

Зависимости Maven:

      <dependency>
    <groupId>com.github.waffle</groupId>
    <artifactId>waffle-jna</artifactId>
    <version>1.8.3</version>
</dependency>

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>4.3.0</version>
</dependency>

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>4.3.0</version>
</dependency>
Другие вопросы по тегам