我能够创建一个 elasticsearch 8.5.3 服务器作为 docker 镜像,但安全性完全禁用,并且在我的 springboot 应用程序中,我使用 ElasticsearchRepository
来执行插入、更新和删除以及ElasticsearchOperations
来执行选择和搜索,这两个类/接口(interface)都包含在 Spring Boot Starter Data Elasticsearch 3.0.1 依赖项中,并且我还使用以下 application.yaml 属性来告诉它们在哪里服务器位于
spring:
elasticsearch:
uris =
- http://localhost:9700
# username: elastic
# password: 123
现在,这是我的问题:
我设置了另一个具有完整安全功能的elasticsearch服务器来在现实生活场景中测试我的springboot代码,但我不知道如何更改application.yaml以添加安全选项的证书部分,我一直被困住在这部分上已经一周了,我知道它包含像 spring.elasticsearch.username 和 spring.elasticsearch.password 这样的选项,这不是问题,但是问题在哪里证书的选项,以及如何使证书在 ElasticsearchRepository
和 ElasticsearchOperation
上工作?我从大多数教程中收集到,我需要构建一个 @configuration
类,但重点是,大多数(如果不是全部)教程都使用已弃用的方法(我陷入了“这是已弃用的循环),例如高级休息客户端。我对如何使 ElasticsearchRepository 和 ElasticsearchOperation 利用指定的 @Configuration 以及高级 Rest 客户端的替代方案感到困惑
(我认为它的 RestClient
基于我在官方文档上读到的内容,但我不知道如何使用 spring boot elasticsearch data starter 来实现它)
最佳答案
你能做的就是扩展ElasticsearchConfiguration
并重写 clientConfiguration
方法。在那里您可以使用 usingSsl
方法并传递 SSLContext
:
@Configuration
class ElasitcSearchConfig extends ElasticsearchConfiguration {
@Value("${spring.elasticsearch.client.certificate}")
private String certificateBase64;
@Override
ClientConfiguration clientConfiguration() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("localhost:9200")
.usingSsl(getSSLConetxt())
.withBasicAuth("elastic", "changeme")
.build();
return clientConfiguration;
}
private SSLContext getSSLContext() {
byte[] decode = Base64.decoder.decode(certificateBase64)
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate ca;
try (InputStream certificateInputStream = new ByteArrayInputStream(decode)) {
ca = cf.generateCertificate(certificateInputStream);
}
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
return context;
}
}
certificateBase64
将保存以base64格式编码的elasticsearch证书,并且可以通过属性文件或环境变量(属性spring.elasticsearch.client.certificate
的名称)注入(inject)。创建ssl上下文的代码最初取自this answer .
关于java - 如何在maven java springboot中使用Starter Data Elasticsearch 3.0.1配置elasticsearch 8.5.3中的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75081596/