首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring boot admin:客户端无法通过https向管理服务器注册

Spring boot admin:客户端无法通过https向管理服务器注册
EN

Stack Overflow用户
提问于 2021-02-25 22:10:20
回答 1查看 764关注 0票数 0

我有几个spring-boot微服务,它们将自己注册到spring-boot-admin (SBA)。当我在本地运行微服务和SBA服务器时,客户端能够通过HTTP向SBA服务器注册自己。

当我将应用程序部署到Kubernetes集群时,向SBA的注册是通过HTTPS完成的(通过Ingress)我得到一个

javax.net.ssl.SSLHandshakeException在日志中

代码语言:js
复制
d.c.b.a.c.r.ApplicationRegistrator : Failed to register application as Application(name=my-app, managementUrl=https://my-app-dev.mydomain.com/actuator, healthUrl=https://my-app-dev.mydomain.com/actuator/health, serviceUrl=https://my-app-dev.mydomain.com) at spring-boot-admin ([https://my-admin-dev.mydomain.com/instances]): I/O error on POST request for "https://my-admin-dev.mydomain.com/instances": Received fatal alert: protocol_version; nested exception is javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version. Further attempts are logged on DEBUG level

在微服务( SBA客户端)中,我使用以下依赖项

代码语言:javascript
复制
de.codecentric
  spring-boot-admin-starter-client
  2.4.0

和以下内容application.yaml

代码语言:javascript
复制
spring.boot.admin.client:
  url: "https://my-admin-dev.mydomain.com"
  instance.service-url: "https://my-app-dev.mydomain.com"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-25 22:14:42

我能够深入到spring-boot-admin-starter-client代码。首先,我从ApplicationRegistrator从日志消息中找到了一个可重写的BlockingRegistrationClient实例(耶!)

代码语言:javascript
复制
public class SpringBootAdminClientAutoConfiguration {
    ...
    @Configuration(proxyBeanMethods = false)
    @ConditionalOnBean(RestTemplateBuilder.class)
    public static class BlockingRegistrationClientConfig {
        @Bean
        @ConditionalOnMissingBean
        public BlockingRegistrationClient registrationClient(ClientProperties client) {
            RestTemplateBuilder builder = new RestTemplateBuilder().setConnectTimeout(client.getConnectTimeout())
                    .setReadTimeout(client.getReadTimeout());
            if (client.getUsername() != null && client.getPassword() != null) {
                builder = builder.basicAuthentication(client.getUsername(), client.getPassword());
            }
            return new BlockingRegistrationClient(builder.build());
        }
    }

使用此post作为我的指南,我能够创建一个RestTemplate将信任存储区加载到SSLContext。然后,我可以重写BlockingRegistrationClient实例,它包装了自定义的RestTemplate

代码语言:javascript
复制
@Bean
public BlockingRegistrationClient registrationClient(
        @Value("${ssl.protocol}") String protocol,
        @Value("${ssl.trustStore.path}") String trustStorePath,
        @Value("${ssl.trustStore.password}") String trustStorePassword,
        ClientProperties client) throws Exception {

    SSLContext sslContext = SSLContextBuilder.create()
            .loadTrustMaterial(new File(trustStorePath), trustStorePassword.toCharArray())
            .setProtocol(protocol)
            .build();

    CloseableHttpClient httpClient = HttpClientBuilder.create()
            .setSSLContext(sslContext)
            .build();

    RestTemplateBuilder builder = new RestTemplateBuilder()
            .setConnectTimeout(client.getConnectTimeout())
            .setReadTimeout(client.getReadTimeout())
            .requestFactory(() -> new HttpComponentsClientHttpRequestFactory(httpClient));

    if (client.getUsername() != null && client.getPassword() != null) {
        builder = builder.basicAuthentication(client.getUsername(), client.getPassword());
    }
    return new BlockingRegistrationClient(builder.build());
}

application.yaml

代码语言:javascript
复制
ssl:
  protocol: TLSv1.2
  trustStore:
    path: "/opt/java/openjdk/lib/security/cacerts"
    password: "*****"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66370140

复制
相关文章

相似问题

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