我正在使用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-name。
不幸的是,Eureka
服务查找失败-声明证书路径无法验证。
谁能告诉我,如何设置一个spring @Configuration @Bean
,将我的ClientRequestHttpFactory
注入到spring eureka client
使用的jersey client
中?
不允许将证书链放入JDK/JRE
默认truststore
。
发布于 2018-05-14 23:30:56
我发现spring cloud不允许定制SSL调用的地方不止一个。我们通过实现ApplicationStartingEvent
并使用它加载我们自己的信任库来解决这个问题,我们从信任库中为运行的JVM创建一个默认的SSL。
缺点是你这么早就没有任何spring支持。还有其他方法可以提前进入,比如spring.factories
bootstrap上下文注入,但你可能会发现,越晚接入,spring cloud就越有可能已经尝试连接到Eureka。
https://stackoverflow.com/questions/50332172
复制相似问题