Настройте SSLContext для Spring DiscoveryClient - PullRequest
0 голосов
/ 14 мая 2018

Я использую 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-имя службы.

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

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

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

1 Ответ

0 голосов
/ 14 мая 2018

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

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

...