Невозможно пройти аутентификацию с помощью http-клиента apache 4.5 с использованием кеша билетов Kerberos

Я выполняю запрос https к службе REST с проверкой подлинности Kerberos. Все в порядке, если я использую keytab. Однако у меня есть требование, чтобы я использовал файл кэша билетов kerberos, который создается, когда кто-то входит в систему на рабочей станции, используя ее пароль.

Я заменю домен на MY_DOMAINE.COM

Итак, клист показывает:

Ticket cache: FILE:/tmp/krb5cc_210007
Default principal: dragomira@MY_DOMAINE.COM

Valid starting     Expires            Service principal
05/15/18 07:21:51  05/15/18 17:21:51  krbtgt/MY_DOMAINE.COM@MY_DOMAINE.COM
        renew until 05/22/18 06:18:22

Использование curl работает нормально:

curl -k --negotiate -u :  'my_url' -v

Теперь давайте вернемся к коду. Мой login.conf такой:

com.sun.security.jgss.login {
  com.sun.security.auth.module.Krb5LoginModule required
  client=TRUE
  doNotPrompt=true
  useTicketCache=true;
};

com.sun.security.jgss.initiate {
  com.sun.security.auth.module.Krb5LoginModule required
  client=TRUE
  doNotPrompt=true
  useTicketCache=true;
};

com.sun.security.jgss.accept {
  com.sun.security.auth.module.Krb5LoginModule required
  client=TRUE
  doNotPrompt=true
  useTicketCache=true;
};

Соответствующий java-код для моего http-клиента, настроенного для kerberos:

try {
    SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build();
    HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
    Registry<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
            .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory())
            .build();
    Credentials dummyCredentials = new NullCredentials();
    CredentialsProvider credProv = new BasicCredentialsProvider();
    credProv.setCredentials(new AuthScope(null, -1, null), dummyCredentials);
    this.httpClient = HttpClientBuilder.create()
            .setDefaultAuthSchemeRegistry(authSchemeRegistry)
            .setDefaultCredentialsProvider(credProv)
            .setSSLContext(sslContext)
            .setSSLHostnameVerifier(hostnameVerifier)
            .build();
} catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {
    throw new RuntimeException(e.getMessage(), e);
}

Перед этим я устанавливаю эти свойства Java:

java.security.auth.login.config=/home/dragomira/kerberos/login.conf
java.security.krb5.conf=/etc/krb5.conf
sun.security.krb5.debug=true
javax.security.auth.useSubjectCredsOnly=false

Вывод журнала kerberos:

Загружается из конфигурации Java

>>>KinitOptions cache name is /tmp/krb5cc_210007
>>>DEBUG <CCacheInputStream>  client principal is dragomira@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> server principal is krbtgt/MY_DOMANIN.COM@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> key type: 18
>>>DEBUG <CCacheInputStream> auth time: Tue May 15 06:18:22 EDT 2018
>>>DEBUG <CCacheInputStream> start time: Tue May 15 07:21:51 EDT 2018
>>>DEBUG <CCacheInputStream> end time: Tue May 15 17:21:51 EDT 2018
>>>DEBUG <CCacheInputStream> renew_till time: Tue May 22 06:18:22 EDT 2018
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE; INITIAL; PRE_AUTH;
>>>DEBUG <CCacheInputStream>  client principal is dragomira@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> server principal is HTTP/configuration.prd.int.MY_DOMANIN.COM@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> key type: 23
>>>DEBUG <CCacheInputStream> auth time: Tue May 15 06:18:22 EDT 2018
>>>DEBUG <CCacheInputStream> start time: Tue May 15 07:57:49 EDT 2018
>>>DEBUG <CCacheInputStream> end time: Tue May 15 17:21:51 EDT 2018
>>>DEBUG <CCacheInputStream> renew_till time: Tue May 22 06:18:22 EDT 2018
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE; PRE_AUTH;
>>> unsupported key type found the default TGT: 18

Так что мне кажется, что билет читается, но из него не извлекаются учетные данные, так как я получаю в конце 401.

Должен ли я сделать что-то особенное для http-клиента apache 4.5, чтобы использовать билет?

С уважением


person adragomir    schedule 15.05.2018    source источник
comment
Я полагаю, что что-то связанное с этим « title = «jaas не может сохранить билет kerberos в файл кеша и не может создать кеш»> stackoverflow.com/questions/45463635/. Также см. этот stackoverflow .com/questions/48411107/   -  person Tarun Lalwani    schedule 17.05.2018


Ответы (3)


На основании ошибки: unsupported key type found the default TGT: 18

Введите 18 = aes-256-cts-hmac-sha1-96 (см. Параметры IANA Kerberos)

Я думаю, что вы используете JRE с политикой JCE ограниченной силы и должны установить политику JCE неограниченной силы.

На сайте загрузки Oracle для Oracle JRE. В разделе "Дополнительные ресурсы" см. Файлы политик юрисдикции неограниченной силы Java Cryptography Extension (JCE) для JDK/JRE 8

загрузки Oracle Java SE

См. также: технические заметки по Oracle Java SE 8. jgss

ПРИМЕЧАНИЕ. Платформа JCE в составе JDK включает возможность применять ограничения в отношении криптографических алгоритмов и максимальных криптографических степеней, доступных для приложений. Такие ограничения указаны в «файлах политики юрисдикции». Файлы политики юрисдикции, входящие в состав Java SE, ограничивают максимальную длину ключа. Следовательно, чтобы использовать тип шифрования AES256, вам необходимо установить политику шифрования JCE с неограниченной версией, чтобы разрешить использование AES с 256-битным ключом.

Проверка вашей политики (источник):

jrunscript -e 'print (javax.crypto.Cipher.getMaxAllowedKeyLength("AES") >= 256);'

С начала 2018 года Oracle JDK во всех поддерживаемых версиях начинает поставляться с политикой JCE неограниченной силы по умолчанию:

https://bugs.openjdk.java.net/browse/JDK-8189377

Также ознакомьтесь с этими интересными обходными путями с отражением и возможной настройкой переопределения для JRE9: /а>

person Gerrit    schedule 23.05.2018
comment
это было! У меня был установлен open jdk, в котором они были установлены, но в моем проекте использовался oracle jdk, который не - person adragomir; 24.05.2018

М-м-м...

Принципал по умолчанию: dragomira@MY_DOMAINE.COM

Субъект клиента DEBUG — dragomira@MY_DOMANIN.COM.

ДОМАНИН?

person OptimalChoice    schedule 22.05.2018

Я делаю то же самое в весеннем загрузочном приложении. Я могу сделать остаточный вызов, используя билет кеша (users/conf/krb5_xyz) и правильно аутентифицированный.

мой рабочий клиент:

public class Test {

    public static void main(String[] args) {


        Map<String, Object> loginOption = new HashMap<>();
        loginOption.put("refreshKrb5Config","true");
        loginOption.put("useTicketCache", "true");
        loginOption.put("ticketCache","h:/config/krb5cc_xyz");
        loginOption.put("doNotPrompt","true");
        loginOption.put("debug","true");

  /* 
option 1 : using keytab

KerberosRestTemplate restTemplate = new KerberosRestTemplate("C:\\Users\\xyz\\kerberos\\kerberos\\src\\main\\resources\\xyz.keytab", "[email protected]");*/

/* option 2: using cache */
       KerberosRestTemplate restTemplate = new KerberosRestTemplate(null , "-",loginOption);
        String response = restTemplate.getForObject("http://host:13080/xyz",String.class);
        System.out.println("Result"+response);


    }
person Ankur Dongre    schedule 09.08.2018