java - 如何在maven java springboot中使用Starter Data Elasticsearch 3.0.1配置elasticsearch 8.5.3中的安全性

标签 java spring-boot elasticsearch spring-data-elasticsearch

我能够创建一个 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 这样的选项,这不是问题,但是问题在哪里证书的选项,以及如何使证书在 ElasticsearchRepositoryElasticsearchOperation 上工作?我从大多数教程中收集到,我需要构建一个 @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/

相关文章:

java - 沙箱 Paypal webhook 集成

c# - 如何将两个查询的结果合并到 Elasticsearch 中的不同索引?

php - 在 Elasticsearch php API 中使用多种类型或索引

elasticsearch - Elasticsearch中的模糊搜索给出了顺序错误的匹配项

java - Maven Java 主页配置

java - @RequestHeader Map<String, String> 映射默认大小写?

java - 仅更改 application.property spring 中的一个属性

spring-boot - H2DB 的默认 URL 和凭据?

java - 打开下载的 SQLite 数据库

java - Eclipse IDE 中的“设计”选项卡为空白