springboot使用ssl连接elasticsearch

使用es时ssl证书报错 unable to find valid certification path to requested target

1.依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

2.配置证书

ssl证书转换,使用的jdk工具将cer证书转换为jks证书

keytool -import -alias mycert -file mycert.cer -keystore mytruststore.jks -storepass test123..

application.yaml配置

spring:  
  elasticsearch:
    key-store: classpath:ssl/truststore.jks
    #转换证书时的密码
    key-store-password: test123..
    username: admin
    password: xxx
    #不用带协议
    uris: xxxxx:9200

配置类

package com.echosell.spider.appspider.config;

import com.echosell.spider.appspider.entity.properties.EsProperties;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import java.io.FileInputStream;
import java.security.KeyStore;

/**
 * @author zzy
 * @project echosell-spider
 * @description es配置
 * @date 2025年01月20日*
 */
@Configuration
@Slf4j
public class ElasticsearchTemplateConfig {

    @Autowired
    EsProperties esProperties;
    @Autowired
    ResourceLoader resourceLoader;

    @Bean
    public RestHighLevelClient restHighLevelClient() throws Exception {
        ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo(esProperties.getUris())
                .usingSsl(createSSLContext(esProperties.getKeyStore(), esProperties.getKeyStorePassword()))
                .withBasicAuth(esProperties.getUsername(), esProperties.getPassword())
                .build();
        return RestClients.create(clientConfiguration).rest();
    }

    @Bean
    public ElasticsearchRestTemplate elasticsearchRestTemplate(RestHighLevelClient restHighLevelClient){
        return new ElasticsearchRestTemplate(restHighLevelClient);
    }




    private SSLContext createSSLContext(String keyStorePath, String keyStorePassword) throws Exception {
//        // 加载密钥库
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        Resource resource = resourceLoader.getResource(keyStorePath);
        // 读取文件内容...
        try (FileInputStream fileInputStream = new FileInputStream(resource.getFile())) {
            trustStore.load(fileInputStream, keyStorePassword.toCharArray());
        }

        // 创建信任管理器工厂
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(trustStore);
        // 初始化 SSLContext
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustManagerFactory.getTrustManagers(), null);

        return sslContext;
    }

}

3.信任所有证书(无证书使用)

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{new X509TrustManager() {
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[0];
    }
}}, new SecureRandom());

直接使用ElasticsearchRestTemplate即可

4.介绍

网上百度无结果,查看了部分源码发现 RestHighLevelClient 使用的SSLContext,且默认使用的系统默认证书 ,将自己的证书导入 SSLContext,封装到RestHighLevelClient即可。

<think>嗯,我现在要在Spring Boot连接Elasticsearch,而且需要跳过SSL认证。这个问题好像涉及到配置ES客户端以及处理SSL证书的问题。让我先回忆一下之前的经验或者看过的资料。 记得用户提供的引用里有几个相关的。比如引用[2]提到在配置证书的时候出现了问题,错误是“unable to find valid certification path”,这可能是因为SSL证书没有正确配置。然后引用[3]讲的是RestTemplate跳过SSL验证的方法,用了一个自定义的SSL类来绕过证书检查。引用[5]则提到在连接集群ES时使用SSL认证,并且希望有一个通用的配置方法,同时本地开发和线上集群都能适用。 首先,Spring Boot连接ES通常有两种方式:使用RestHighLevelClient或者ElasticsearchRepository。不过现在ES的Java客户端可能有变化,特别是在版本8.x之后,TransportClient已经被弃用了,应该用新的Java API Client或者RestClient。但根据引用里的信息,用户可能还在使用RestClient或者Spring Data Elasticsearch的配置。 跳过SSL认证的话,通常需要配置客户端信任所有证书,也就是禁用SSL验证。在Java中,这通常涉及到设置SSLContext,比如信任所有证书的TrustManager。比如,可以创建一个自定义的SSLContext,然后将其应用到ES的客户端配置中。 引用[3]中的例子是RestTemplate跳过了SSL验证,这可能类似,但ES的客户端配置方式不同。比如,如果是使用RestClient,可能需要自定义HttpClientConfigCallback,设置SSLContext。 引用[5]提到了使用@PostConstruct来初始化连接,可能是在应用启动时构建客户端实例。同时,他们的配置文件可能根据环境不同切换单机或集群配置,可能涉及到设置ssl.verification_mode为none或者配置特定的证书路径。 在Spring Data Elasticsearch的配置中,可能需要在application.properties或application.yml里设置相关的属性,比如spring.elasticsearch.rest.ssl.verification-mode=none,但不确定这个属性是否存在。或者需要通过Java配置类来覆盖默认的RestClient配置。 另外,引用[2]中的配置可能涉及到添加证书到信任库,但如果想跳过验证,可能需要更直接的方法,比如禁用证书检查,而不是导入证书。 可能的步骤是: 1. 添加ES的依赖,如spring-boot-starter-data-elasticsearch。 2. 在配置文件中设置ES的地址,比如spring.elasticsearch.uris。 3. 配置SSL相关参数,比如关闭验证。 4. 通过Java配置自定义RestClientBuilder,设置SSLContext为信任所有。 但具体怎么实现呢?比如,在Spring Boot中,如何自定义RestClient的SSL设置? 可能需要创建一个配置类,实现ElasticsearchRestClientConfiguration接口,或者自定义RestClientBuilder的bean。然后在该配置中设置SSLContext。 例如,创建自定义的RestClient配置,其中SSLContext使用信任所有证书的TrustManager。然后通过RestClientBuilder来应用这个配置。 另外,引用[3]中的SSL类可能可以借鉴,但需要适配到ES的客户端配置中。 可能还需要处理主机名验证的问题,因为即使信任了证书,主机名不匹配也会导致错误,所以可能需要禁用主机名验证。 总结一下,可能的解决方案是: - 配置RestClient使用自定义的SSLContext,该上下文信任所有证书。 - 禁用主机名验证。 - 将这些配置应用到Spring Data Elasticsearch的客户端中。 现在需要把这些步骤转化为具体的代码配置。例如,在配置类中定义RestClient的bean,并设置HttpClientConfigCallback来应用SSL设置。 具体代码可能包括: - 创建一个TrustManager数组,其中包含一个X509TrustManager的实现,该实现不进行任何证书检查。 - 初始化一个SSLContext,使用这个TrustManager。 - 在RestClientBuilder中设置SSLContext,并设置setHttpClientConfigCallback,配置SSL和主机名验证。 此外,需要确保这些配置在应用启动时被正确加载,可能需要使用@Configuration注解的配置类。 可能还需要注意ES的版本兼容性,比如不同版本的Spring Data Elasticsearch对应的配置方式可能不同。根据引用中的版本是8.12.2,可能需要查阅对应版本的文档。 另外,application.yml中的配置可能需要设置ssl.verification-mode为none,如果该属性存在的话。例如: spring: elasticsearch: rest: ssl: verification-mode: none 但不确定这个属性是否有效,可能需要查阅Spring Data Elasticsearch的文档。如果该属性不存在,则必须通过Java配置来实现。 综上,配置方法可能包括Java配置类和application.yml中的相关属性设置。需要结合这两种方式,确保SSL验证被正确跳过。</think>在Spring Boot连接Elasticsearch并跳过SSL认证的配置方法如下: ### 配置步骤 1. **添加依赖** 确保项目中包含Spring Data Elasticsearch依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` 2. **配置application.yml** 设置Elasticsearch地址并关闭SSL验证: ```yaml spring: elasticsearch: uris: ["https://localhost:9200"] rest: ssl: verification-mode: none # 关闭证书验证[^2] ``` 3. **自定义SSL配置类(可选)** 若上述配置无效,可通过Java代码强制跳过SSL验证: ```java @Configuration public class ElasticsearchConfig { @Bean public RestClientBuilder elasticsearchRestClientBuilder() { return RestClient.builder(HttpHost.create("https://localhost:9200")) .setHttpClientConfigCallback(httpClientBuilder -> { try { SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[]{new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) {} public void checkServerTrusted(X509Certificate[] chain, String authType) {} public X509Certificate[] getAcceptedIssuers() { return null; } }}, new SecureRandom()); return httpClientBuilder .setSSLContext(sslContext) .setSSLHostnameVerifier((hostname, session) -> true); // 禁用主机名验证 } catch (Exception e) { throw new RuntimeException(e); } }); } } ``` ### 验证配置 - 启动应用后检查Elasticsearch连接日志,确保无证书相关错误。 - 若使用集群模式,需确保所有节点地址已正确配置[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值