如何使用Starter Data在maven java springboot中配置elasticsearch 8.5.3



我能够创建一个elasticsearch 8.5.3服务器作为docker映像,但是完全禁用了安全性,在我的springboot应用程序中,我使用ElasticsearchRepository执行插入、更新和删除,ElasticsearchOperations执行选择和搜索,这两个类/接口都包含在Spring Boot Starter Data elasticsearch 3.0.1依赖项中,我还使用以下应用程序。属性来告诉服务器在

处的位置。
spring:
elasticsearch:
uris = 
- http://localhost:9700
# username: elastic
# password: 123

现在,这是我的问题:我设置了另一个具有完整安全特性的elasticsearch服务器,以便在实际场景中测试我的springboot代码,但我不知道如何更改应用程序。添加安全选项的证书部分,我已经在这部分卡住了一个星期了,我知道它包含像spring.elasticsearch.usernamespring.elasticsearch.password这样的选项,这不是问题,但是证书的选项在哪里,我如何使证书在ElasticsearchRepositoryElasticsearchOperation上工作?我从大多数教程中收集到,我需要构建一个@configuration类,但关键是,大多数,如果不是所有的教程使用过时的方法(我被困在一个"这是过时的"循环),比如High Level Rest Client。我很困惑如何使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)注入。创建ssl上下文的代码最初取自这个答案。

您可以通过提供配置bean来配置Spring Data Elasticsearch使用的客户端,这在https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.clients.restclient的文档中有描述。客户端配置的详细信息在文档的后面一点:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.clients.configuration.

这使您可以配置身份验证和ssl设置(也有一个usingSsl方法接受ssl上下文,可以进一步自定义)。

我不能告诉你在应用程序配置中设置哪些属性,这是Spring启动的主题,Spring Data Elasticsearch本身不会读取或使用任何配置值。

最新更新