Я использую 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.




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