我使用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
服务查找失败 - 说明无法验证证书路径。
任何人都可以告诉我,如何例如设置一个弹簧@Configuration @Bean
,将ClientRequestHttpFactory
注入jersey client
使用的spring eureka client
?
我不允许将证书链放入JDK/JRE
默认truststore
。
答案 0 :(得分:0)
我发现Spring云不允许自定义SSL调用的地方不止一个地方。我们通过实现ApplicationStartingEvent
并使用它来加载我们自己的信任库来解决它,我们从中创建了一个运行JVM的默认SSL上下文。
缺点是你很早就没有任何弹簧支撑。还有其他方法可以提前进入,例如spring.factories
引导上下文注入,但是你可能会发现,你越接近春天云就已经尝试连接到Eureka了。