引言
Elasticsearch 8.x 版本迎来了一个重大的安全变革:默认开启安全特性(Security Features)。这意味着,当你安装好 ES 8.x 后,不再像以往那样可以直接通过 http://localhost:9200 匿名访问。集群默认强制启用 HTTPS (TLS/SSL) 加密传输,并要求进行身份认证。
对于 Java 开发者而言,这带来了一个直接的挑战:如何在代码中正确处理自签名证书(CA Certificate)并完成认证?如果处理不当,你会频繁遇到 SSLHandshakeException: PKIX path validation failed 或 unable to find valid certification path to requested target 等错误。
本文将基于提供的代码实例,深入剖析 Elasticsearch 8.x Java Client 的安全连接机制,分享如何优雅地加载 CA 证书、配置 SSLContext 并结合 ApiKey 完成安全连接。
一、核心痛点:为什么 8.x 连接这么'麻烦'?
在 7.x 及更早版本中,我们通常使用 RestHighLevelClient,且很多时候在开发环境会直接禁用 SSL 验证。但在 8.x 中:
- 强制 HTTPS:HTTP 明文传输被默认禁止。
- 自签名证书:ES 启动时会自动生成一个 CA 证书(通常位于
config/certs/http_ca.crt)。Java 默认的 TrustStore(信任库)并不信任这个自签名证书,因此握手会失败。 - 客户端升级:官方推荐使用全新的 Elasticsearch Java API Client (
co.elastic.clients:elasticsearch-java),它基于 Jackson 和新的传输层,配置方式与旧版有所不同。
解决方案的核心思路:
我们需要手动将 ES 生成的 http_ca.crt 加载到 Java 的 TrustStore 中,构建一个信任该证书的 SSLContext,并将其注入到 HTTP 客户端中。同时,配合 ApiKey 或账号密码进行认证。
二、实战代码解析
下面是一个标准的 Spring Boot 组件实现,展示了如何安全地连接 ES 8.x。
1. 依赖准备
确保你的 pom.xml 中包含以下核心依赖(版本需与 ES 服务端匹配,例如 8.11.1):
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.5.2</version>
</dependency>
<!-- Jackson for JSON processing (通常已包含,但显式声明更安全) -->
<dependency>
com.fasterxml.jackson.core
jackson-databind
2.15.2
org.apache.httpcomponents
httpclient
4.5.14


