Клиент Kerberos — kerberoRestTemplate не работает

#spring-boot #spring-security #kerberos #resttemplate #spring-security-kerberos

#весенняя загрузка #весна-безопасность #kerberos #resttemplate #весна-безопасность-kerberos

Вопрос:

Я пытаюсь использовать API, который проверяет подлинность с помощью Kerberos. Я сослался на приведенную ниже документацию spring, связанную с KerberosRestTemplate.reference link, я передаю правильный файл keytab и значения UserPrincipal, как указано в справочном документе. Но я все равно получаю 401 с сервера. Но когда я выполняю команду kinit в терминале, он получает запрос от KDC, и с его помощью я могу выполнить команду curl и получить рабочий ответ.

         KerberosRestTemplate kerberosRestTemplate = new KerberosRestTemplate("svc_dfsd.keytab", "svc_dfsd@sswe.AD");
        String url="https://wexample.com:20550/aggr_subscriber_summary_hbase/03434809824";
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Arrays.asList(MediaType.TEXT_XML));
        HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

        ResponseEntity<String> response = kerberosRestTemplate.exchange(url, HttpMethod.GET, entity, String.class);
 

Можете ли вы предложить какой-либо другой лучший подход для этого или исправить это. Все ваши комментарии высоко ценятся!!!

Ответ №1:

Устранение неполадок в Kerberos может быть сложным, поскольку ошибки часто вводят в заблуждение, А реализация Java выполняет много неявных действий (канонизация URL-адресов и т. Д.).

Я предлагаю попробовать библиотеку kerber4j, которая позволяет явно генерировать токен kerberos:

 SpnegoClient spnegoClient = SpnegoClient.loginWithKeyTab("svc_dfsd@sswe.AD", "svc_dfsd.keytab");
SpnegoContext context = spnegoClient.createContext("https://wexample.com"); // Will result in HTTP/wexample.com SPN

RestTemplate restTemplate = new RestTemplate();
String url="https://wexample.com:20550/aggr_subscriber_summary_hbase/03434809824";
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.TEXT_XML));
headers.add("Authorization", context.createTokenAsAuthroizationHeader());
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

ResponseEntity<String> response = restTemplate .exchange(url, HttpMethod.GET, entity, String.class);
 

Если разрешение SPN по умолчанию работает для вас, вы также можете использовать SpnegoRestTemplate из этого kerber4j:

 SpnegoClient spnegoClient = SpnegoClient.loginWithKeyTab("svc_dfsd@sswe.AD", "svc_dfsd.keytab");

SpnegoRestTemplate spnegoRestTemplate = new SpnegoRestTemplate(spnegoClient);
String url="https://wexample.com:20550/aggr_subscriber_summary_hbase/03434809824";
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.TEXT_XML));
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

ResponseEntity<String> response = spnegoRestTemplate.exchange(url, HttpMethod.GET, entity, String.class);
 

Отказ от ответственности: Я автор kerber4j