Java Spring引导管理:客户端可以';t通过https向管理服务器注册

Java Spring引导管理:客户端可以';t通过https向管理服务器注册,java,spring-boot,ssl,https,spring-boot-admin,Java,Spring Boot,Ssl,Https,Spring Boot Admin,我有一些SpringBoot微服务,它们向SpringBootAdmin(SBA)注册。当我在本地运行微服务和SBA服务器时,客户机能够通过HTTP向SBA服务器注册自己 当我将应用程序部署到Kubernetes集群时,通过HTTPS(通过an)向SBA注册,我在日志中得到一个javax.net.ssl.SSLHandshakeException d.c.b.a.c.r.ApplicationRegistrator : Failed to register application as Appl

我有一些SpringBoot微服务,它们向SpringBootAdmin(SBA)注册。当我在本地运行微服务和SBA服务器时,客户机能够通过HTTP向SBA服务器注册自己

当我将应用程序部署到Kubernetes集群时,通过HTTPS(通过an)向SBA注册,我在日志中得到一个
javax.net.ssl.SSLHandshakeException

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客户端)中,我使用以下依赖项

<dependency>
  <groupId>de.codecentric</groupId>
  <artifactId>spring-boot-admin-starter-client</artifactId>
  <version>2.4.0</version>
</dependency>

我能够插入
spring boot admin starter客户端
代码。首先,我从日志消息中的
ApplicationRegistrator
开始,它引导我找到了一个可覆盖的
BlockingRegistrationClient
实例(耶!)

公共类SpringBootAdminClientAutoConfiguration{
...
@配置(proxyBeanMethods=false)
@ConditionalOnBean(RestTemplateBuilder.class)
公共静态类BlockingRegistrationClientConfig{
@豆子
@条件性缺豆
公共阻止注册客户端注册客户端(客户端属性客户端){
RestTemplateBuilder=新建RestTemplateBuilder().setConnectTimeout(client.getConnectTimeout())
.setReadTimeout(client.getReadTimeout());
if(client.getUsername()!=null&&client.getPassword()!=null){
builder=builder.basicAuthentication(client.getUsername(),client.getPassword());
}
返回新的BlockingRegistrationClient(builder.build());
}
}   
使用as I guide,我能够创建一个
restemplate
,并将信任存储加载到
SSLContext
中。然后,我可以用自己的
BlockingRegistrationClient
实例覆盖
restmplate

@Bean
公共阻止注册客户端注册客户端(
@值(“${ssl.protocol}”)字符串协议,
@值(${ssl.trustStore.path}”)字符串trustStorePath,
@值(${ssl.trustStore.password}”)字符串trustStorePassword,
ClientProperties(客户端)引发异常{
SSLContext SSLContext=SSLContextBuilder.create()
.loadTrustMaterial(新文件(trustStorePath)、trustStorePassword.ToCharray())
.setProtocol(协议)
.build();
CloseableHttpClient httpClient=HttpClientBuilder.create()
.setSSLContext(sslContext)
.build();
RestTemplateBuilder=新的RestTemplateBuilder()
.setConnectTimeout(client.getConnectTimeout())
.setReadTimeout(client.getReadTimeout())
.requestFactory(()->新的HttpComponents客户端HttpRequestFactory(httpClient));
if(client.getUsername()!=null&&client.getPassword()!=null){
builder=builder.basicAuthentication(client.getUsername(),client.getPassword());
}
返回新的BlockingRegistrationClient(builder.build());
}
应用程序.yaml

ssl:
  protocol: TLSv1.2
  trustStore:
    path: "/opt/java/openjdk/lib/security/cacerts"
    password: "*****"
ssl:
  protocol: TLSv1.2
  trustStore:
    path: "/opt/java/openjdk/lib/security/cacerts"
    password: "*****"