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证书转换
keytool -import -alias mycert -file mycert.cer -keystore mytruststore.jks -storepass mytruststorepassword
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 张子一
* @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即可。
原文地址:https://blog.csdn.net/qq_27275851/article/details/145280458
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!