首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为Spring DiscoveryClient配置SSLContext

为Spring DiscoveryClient配置SSLContext
EN

Stack Overflow用户
提问于 2018-05-14 21:58:41
回答 1查看 637关注 0票数 3

我正在使用Spring OAuth2RestTemplate来访问REST服务。我需要使用Eureka来更改我的代码以进行服务发现。所有的通信必须是HTTPS的,我在客户端有一个truststore,其中包含证书,以验证服务器证书的REST服务,OAuth ServerEureka server。我没有使用JDK truststore

对于REST服务和OAuth服务器访问,我设法提供了一个ClientHttpRequestFactory,它处理SSL并使用来自本地truststore的证书进行certchain验证,如下所示:

代码语言:javascript
运行
复制
@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服务查找失败-声明证书路径无法验证。

谁能告诉我,如何设置一个spring @Configuration @Bean,将我的ClientRequestHttpFactory注入到spring eureka client使用的jersey client中?

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-14 23:30:56

我发现spring cloud不允许定制SSL调用的地方不止一个。我们通过实现ApplicationStartingEvent并使用它加载我们自己的信任库来解决这个问题,我们从信任库中为运行的JVM创建一个默认的SSL。

缺点是你这么早就没有任何spring支持。还有其他方法可以提前进入,比如spring.factories bootstrap上下文注入,但你可能会发现,越晚接入,spring cloud就越有可能已经尝试连接到Eureka。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50332172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档