Настройте SSLContext для Spring DiscoveryClient

Я использую Spring OAuth2RestTemplate для доступа к службе REST. Мне нужно изменить свой код, используя Eureka для обнаружения служб. Все коммуникации должны быть HTTPS, и у меня есть truststore на стороне клиента, который содержит сертификаты для проверки сертификатов сервера службы REST, OAuth Server и Eureka server. Я НЕ использую JDK truststore.

Для службы REST и доступа к серверу OAuth мне удалось предоставить ClientHttpRequestFactory, который обрабатывает SSL и использует сертификаты из моего локального truststore для проверки certchain следующим образом:

@Bean
public ClientHttpRequestFactory requestFactory(final KeyStore trustStore)
        throws NoSuchAlgorithmException, KeyStoreException,
                KeyManagementException {
    SSLConnectionSocketFactory socketFactory
            = new SSLConnectionSocketFactory(
                    SSLContexts.custom().loadTrustMaterial(
                            trustStore,
                            (x509Certificates, s) -> false).build(),
                    NoopHostnameVerifier.INSTANCE);

    HttpClient httpClient = HttpClients.custom()
            .setSSLSocketFactory(socketFactory)
            .build();

    return new HttpComponentsClientHttpRequestFactory(httpClient);
}

@LoadBalanced
@Bean
public OAuth2RestTemplate oauth2RestTemplate(
        final ClientHttpRequestFactory requestFactory) {
    ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails();

    resourceDetails.setAccessTokenUri(env.getProperty(ACCESS_TOKEN_URI_PROPERTY));

    resourceDetails.setClientId(env.getProperty(CLIENT_ID_PROPERTY));
    resourceDetails.setClientSecret(env.getProperty(CLIENT_SECRET_PROPERTY));
    resourceDetails.setGrantType(env.getProperty(CLIENT_GRANTTYPE_PROPERTY));

    OAuth2RestTemplate result = new OAuth2RestTemplate(resourceDetails);

    result.setRequestFactory(requestFactory);

    ClientCredentialsAccessTokenProvider accessTokenProvider = new ClientCredentialsAccessTokenProvider();
    accessTokenProvider.setRequestFactory(requestFactory);

    result.setAccessTokenProvider(accessTokenProvider);

    return result;
}

Моя конфигурация аннотирована @EnableDiscoveryClient, поэтому, когда я @Autowire использую OAuth2RestTemplate где-нибудь в моем коде, я могу использовать эврика-имя службы.

К сожалению, поиск службы Eureka завершается неудачно - это означает, что путь сертификации не может быть проверен.

Может ли кто-нибудь сказать мне, как, например, настроить пружинный @Configuration @Bean, который вставляет мой ClientRequestHttpFactory в jersey client, используемый spring eureka client?

Мне не разрешено помещать цепочку сертификатов в JDK/JRE по умолчанию для truststore.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
600
1

Ответы 1

Я обнаружил, что существует более одного места, где весеннее облако не позволяет настраивать вызовы SSL. Мы обошли его, реализовав ApplicationStartingEvent и используя его для загрузки собственного хранилища доверенных сертификатов, из которого мы создаем контекст SSL по умолчанию для работающей JVM.

Недостатком является то, что у вас нет пружинной опоры на столь раннем этапе. Есть и другие способы раннего подключения, такие как внедрение контекста начальной загрузки spring.factories, но вы можете обнаружить, что чем позже вы подключитесь, тем более вероятно, что весеннее облако уже пыталось подключиться к Eureka.

Другие вопросы по теме