Java API 连接 Elasticsearch 使用 SSL 证书的完整指南

在现代化的应用程序中,安全连接至关重要,特别是与 Elasticsearch 的通信。我们将通过以下步骤教你如何在 Java 中使用 SSL 证书连接到 Elasticsearch。首先,我们将概述整个流程,然后详细介绍每一步。

流程概述

以下是连接 Elasticsearch 的主要步骤:

步骤 描述
1 准备 SSL 证书
2 在 Java 项目中引入相关依赖
3 配置 SSL 连接
4 创建连接并发送请求
5 关闭连接

1. 准备 SSL 证书

在连接 Elasticsearch 之前,你需要有 SSL 证书文件(通常是 .crt.pem 文件)。确保这些证书已经准备好,并且可以访问。

2. 在 Java 项目中引入相关依赖

在你的 Java 项目中,你需要引入 Elasticsearch 的相关依赖。如果你使用 Maven,可以在 pom.xml 文件中添加如下依赖:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.15.1</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

3. 配置 SSL 连接

在 Java 中实现 SSL 连接需要一些配置。以下是一个示例代码,展示如何设置 SSL 连接:

import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;

import javax.net.ssl.SSLContext;
import java.io.File;
import java.security.KeyStore;

public class EsSslClient {

    public static RestHighLevelClient createClient() throws Exception {
        // 加载 SSL 证书
        char[] password = "your_keystore_password".toCharArray(); // 替换为你的密码
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        keyStore.load(new File("path_to_your_keystore.p12").toURI().toURL().openStream(), password);
        
        // 构建 SSL 上下文
        SSLContext sslContext = SSLContextBuilder.create()
                .loadTrustMaterial(keyStore, password) // 加载信任材料
                .build();

        // 创建 SSL 连接工厂
        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, new String[]{"TLSv1.2"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
        
        // 创建 HTTP 客户端
        CloseableHttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(socketFactory)
                .build();

        // 创建 Elasticsearch 客户端
        return new RestHighLevelClient(
                RestClient.builder(new HttpHost("your_es_host", your_es_port, "https"))
                        .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setHttpClient(httpClient))
        );
    }
}
  • 上面的代码完成以下任务:
    • 加载你的 keystore 文件(通常是 .p12.jks 格式)。确保提供正确的路径和密码。
    • 创建一个 SSL 上下文,并使其与 keystore 关联。
    • 设置 SSL 连接工厂,并使用 HTTP 客户端创建一个安全的 Elasticsearch 客户端。

4. 创建连接并发送请求

一旦你成功创建了 Elasticsearch 客户端,你就可以开始发送请求了。以下是一个查询的示例:

import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;

public class ElasticsearchQuery {

    public static void main(String[] args) {
        try {
            RestHighLevelClient client = EsSslClient.createClient();
            // 创建查询请求
            GetRequest getRequest = new GetRequest("your_index", "your_document_id");

            // 发送请求并获取响应
            GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);

            // 处理响应
            if (getResponse.isExists()) {
                System.out.println("Document: " + getResponse.getSourceAsString());
            } else {
                System.out.println("No document found");
            }

            // 关闭客户端
            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 此示例中,我们:
    • 创建了一个 GetRequest 请求,查询指定索引中的文档。
    • 使用 client.get() 方法发送请求并获取响应。
    • 处理响应以显示文档内容。
    • 最后关闭了客户端以释放资源。

5. 关闭连接

在完成所有请求后,记得关闭 Elasticsearch 客户端,如上面的代码所示。

类图

以下是系统的类图,展示了主要类之间的关系:

classDiagram
    class EsSslClient {
        +RestHighLevelClient createClient()
    }
    class ElasticsearchQuery {
        +main(String[] args)
    }
    EsSslClient <-- ElasticsearchQuery : uses

结尾

至此,我们完成了使用 Java API 连接 Elasticsearch 的步骤,包括如何配置和使用 SSL 证书。通过以上步骤,你不仅能实现安全连接,还能有效地与 Elasticsearch 进行交互。同时,确保在生产环境中遵循最佳安全实践,妥善管理 SSL 证书和其它敏感信息。如果你在过程中遇到问题,欢迎随时询问!