gpt4 book ai didi

java - 为 Spring DiscoveryClient 配置 SSLContext

转载 作者:太空宇宙 更新时间:2023-11-03 13:05:27 24 4
gpt4 key购买 nike

我正在使用 Spring OAuth2RestTemplate 来访问 REST 服务。我需要更改我的代码使用 Eureka 进行服务发现。所有通信都必须是 HTTPS 并且我在客户端有一个 truststore,其中包含用于验证 REST 服务的服务器证书的证书,OAuth ServerEureka 服务器。我没有使用 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 服务查找失败 - 说明无法验证证书路径。

谁能告诉我,如何设置一个 spring @Configuration @Bean 将我的 ClientRequestHttpFactory 注入(inject) spring eureka 客户端 使用的 jersey 客户端

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

最佳答案

我发现spring cloud不止一处不允许自定义SSL调用。我们通过实现 ApplicationStartingEvent 并使用它来加载我们自己的信任库来绕过它,我们从中为正在运行的 JVM 创建默认的 SSL 上下文。

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

关于java - 为 Spring DiscoveryClient 配置 SSLContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50332172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com