Как решить проблему отсутствия сертификата «4-го измерения»?

#spring #spring-boot

#spring #spring-boot

Вопрос:

У меня есть модуль rest client maven, который отвечает за получение токена, а затем за создание запросов с использованием этого токена.

Вот метод «login ()» :

   private static final String ROOT_URL = "https://my-url";
  private static final String LOGIN_API = "/LogIn";

  @Autowired
  @Qualifier("myRestTemplate")
  RestTemplate restTemplate;

  public String login() {
    LoginRequest loginRequest = new LoginRequest();
    loginRequest.setAccountName("USER");
    loginRequest.setPassword("P@ssw0rd");
    loginRequest.setTimeout(120);

    LoginResponse loginResponse = restTemplate.postForObject(ROOT_URL   LOGIN_API, loginRequest, LoginResponse.class);
    String token = loginResponse.getLogInResult().getToken();

    log.info(loginResponse.toString());
    return token;
  }
  

Когда я вызываю этот метод «login ()» из JUnit внутри модуля, он работает.

Также у меня есть различные службы из других модулей, которые зависят от этого клиентского модуля rest, и они могут вызывать его без ошибок.

Теперь я только что создал новый модуль, которому необходимо использовать эту клиентскую службу rest. Когда я вызываю службу «login ()» из этого нового модуля, она заканчивается :

 ResourceAccessException: I/O error on POST request for "https://my-url/LogIn": 
unable to find valid certification path to requested target
  

Что может вызвать эту ошибку в одном случае, а не в другом, когда вызываемый URL-адрес является константой?

Я попытался проверить, что объект «RestTemplate» одинаков в обоих случаях, и я думаю, что это так, но даже если бы это было не так, как это могло произойти? с помощью какого механизма?

ОБНОВЛЕНИЕ: Я попытался активировать spring debug в org.springframework.beans, чтобы проверить, может ли неправильное внедрение RestTemplate быть причиной этой проблемы, но когда я делаю это из моего родительского модуля, я даже не вижу внедрения какого-либо RestTemplate.

Похоже, что в разветвленной JVM происходит какой-то процесс, и этот разветвленный процесс не знает о сертификатах (тех, что в $ JAVA_HOME / jre / lib / security / cacerts).

Если я отлажу вызов из дочернего модуля, я увижу, что происходит внедрение RestTemplate.

Комментарии:

1. Я предполагаю, что в вашем модуле у вас нет действительного хранилища доверия, где можно найти действительный корневой центр сертификации. Используете ли вы тот же JDK / JRE, который использовался для модульного теста?

2. Модулю не принадлежит truststore. Та же среда разработки (eclipse), тот же способ запуска JUnit без каких-либо конкретных параметров (создается с помощью Alt shift x, затем t), тот же JDK.