springboot使用ssl连接elasticsearch

news/2025/1/26 18:00:54/

使用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: adminpassword: 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 {@AutowiredEsProperties esProperties;@AutowiredResourceLoader resourceLoader;@Beanpublic 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();}@Beanpublic 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);// 初始化 SSLContextSSLContext 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即可。


http://www.ppmy.cn/news/1566028.html

相关文章

什么是三高架构?

大家好&#xff0c;我是锋哥。今天分享关于【什么是三高架构?】面试题。希望对大家有帮助&#xff1b; 什么是三高架构? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 “三高架构”通常是指高可用性&#xff08;High Availability&#xff09;、高性能&#xff…

C22.【C++ Cont】位运算总结(1)(例题五种解法!含汇编解法)

目录 1.撰写缘由 2.知识回顾 位运算符 左移和右移的特点 3.位运算的应用 1.判断奇偶性 2.保留二进制位中的指定位 3.获取二进制的指定位 4.按位或在某些情况下等价于加法运算 *例题 分析 代码 方法1 提交结果 方法2 提交结果 方法3 ​编辑 提交结果 方法4:…

百度输入法,自定义时间短语

设置技巧 高级设置-更多-自定义短语 #$(year)-$(month_mm)-$(day_dd) $(fullhour):$(minute):$(second)函数表如下&#xff1a; 函数 含义 举例$year 年(4位) 2006、2008$year_yy 年(2位) 06、08$month 月 12、8、3$month_mm 月 12、0…

C语言基础------练习

1.求二维数组中元素的最大值&#xff0c;并输出行标和列标 代码运行结果: 代码实现解析: //定义并初始化二维数组int arr[3][4] {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}}; //这里定义了一个3行4列的二维数组&#xff0c;并初始化了其元素。//初始化最大值及其行标和列标…

码随想录算法训练营Day13 | Leetcode226 反转二叉树,101 对称二叉树,104二叉树的最大深度,111二叉树的最小深度

226 反转二叉树 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html 此题最直接的方法是用前序或后序&#xff0c;中序的话需要绕个弯子 前序 class Solution:# 递归三部曲# 1. 确定递归函数、参…

Linux(Centos、Ubuntu) 系统安装jenkins服务

该文章手把手演示在Linux系统下如何安装jenkins服务、并自定义jenkins数据文件位置、以及jenkins如何设置国内镜像源加速&#xff0c;解决插件下载失败问题 安装方式&#xff1a;war包安装 阿里云提供的war下载源地址&#xff1a;https://mirrors.aliyun.com/jenkins/war/?s…

JavaScript 数组的map和join方法、延迟函数、location对象、本地存储、正则表达式、箭头函数

数组处理方法 map方法 map方法的作用是遍历数组所有元素&#xff0c;然后执行处理操作&#xff0c;最后返回一个新的数组 语法格式&#xff1a;新数组 原来数组.map(function(ele,index){ ele是数组元素&#xff0c;index是下标 执行完操作之后使用return 返回一个…

shell中for循环的用法

前言 shell的for循环可以帮助我们做一些重复性非常大的事情。工作中的真实案例很多。 如&#xff1a;docker批量保存和加载&#xff1b;k8s多余pod删除&#xff08;几千个的那种…&#xff09;&#xff1b;多个文件夹中的某类文件删除&#xff1b;批量远程执行程序&#xff08…