为Spring DiscoveryClient配置SSLContext

时间:2018-05-14 13:58:41

标签: java spring ssl netflix-eureka

我使用Spring OAuth2RestTemplate来访问REST服务。 我需要更改我的代码使用Eureka进行服务发现。 所有通信必须为HTTPS,并且客户端上有truststore,其中包含用于验证REST服务的服务器证书的证书OAuth ServerEureka 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-name。

不幸的是Eureka服务查找失败 - 说明无法验证证书路径。

任何人都可以告诉我,如何例如设置一个弹簧@Configuration @Bean,将ClientRequestHttpFactory注入jersey client使用的spring eureka client

我不允许将证书链放入JDK/JRE默认truststore

1 个答案:

答案 0 :(得分:0)

我发现Spring云不允许自定义SSL调用的地方不止一个地方。我们通过实现ApplicationStartingEvent并使用它来加载我们自己的信任库来解决它,我们从中创建了一个运行JVM的默认SSL上下文。

缺点是你很早就没有任何弹簧支撑。还有其他方法可以提前进入,例如spring.factories引导上下文注入,但是你可能会发现,你越接近春天云就已经尝试连接到Eureka了。