You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch(带X-Pack)与Spring本地部署及证书连接问题

Spring连接Elasticsearch 8.2.2(带X-Pack)的证书选择与权限配置

核心需求对应凭证说明

要实现带超级权限(创建角色映射等)的SSL连接,你需要两类关键凭证:

  • HTTP层CA根证书:用于Spring客户端验证Elasticsearch服务端的HTTPS身份,对应首次启动生成的http_ca.crt文件(默认存放在Elasticsearch的config/certs目录下)。
  • 超级权限身份凭证:执行高权限操作必须拥有superuser角色权限,有两种实现方式:
    1. 内置超级用户elastic的用户名+密码:首次启动时Elasticsearch会生成该用户的初始密码(可在启动日志中查看,或用elasticsearch-reset-password命令重置)。
    2. 客户端证书认证:通过生成客户端证书并绑定到superuser角色实现无密码登录,配置相对复杂但更安全。

Spring项目配置步骤(以RestHighLevelClient为例)

方式一:CA证书+elastic用户名密码(推荐,配置简单)

  1. 将http_ca.crt复制到Spring项目的src/main/resources目录下。
  2. 配置RestClient的SSL上下文与身份认证:
@Bean
public RestHighLevelClient elasticsearchClient() throws Exception {
    // 加载CA根证书
    CertificateFactory factory = CertificateFactory.getInstance("X.509");
    ClassPathResource caResource = new ClassPathResource("http_ca.crt");
    Certificate caCert = factory.generateCertificate(caResource.getInputStream());

    // 初始化信任库并添加CA证书
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
    trustStore.load(null);
    trustStore.setCertificateEntry("elasticsearch-ca", caCert);

    // 构建SSL上下文
    SSLContext sslContext = SSLContexts.custom()
            .loadTrustMaterial(trustStore, null)
            .build();

    // 配置elastic用户凭证
    CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY,
            new UsernamePasswordCredentials("elastic", "你的elastic用户密码"));

    // 构建RestHighLevelClient
    RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "https"))
            .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
                    .setSSLContext(sslContext)
                    .setDefaultCredentialsProvider(credentialsProvider));

    return new RestHighLevelClient(builder);
}
  1. 验证权限:通过该客户端调用角色映射创建API(如client.security().putRoleMapping(...)),即可执行超级权限操作。

方式二:客户端证书认证(无密码登录)

  1. 生成客户端证书:执行Elasticsearch内置命令生成客户端证书文件(client.crt和client.key):
./bin/elasticsearch-certutil client --name my-spring-client --out config/certs/client.zip

解压后得到证书文件,将其导入到Java密钥库:

keytool -importkeystore -srckeystore client.p12 -destkeystore client.jks -srcstoretype PKCS12
  1. 配置Elasticsearch角色映射,将客户端证书的DN绑定到superuser角色:
curl -k -u elastic:密码 -X PUT "https://localhost:9200/_security/role_mapping/superuser_client" -H 'Content-Type: application/json' -d'
{
  "roles": ["superuser"],
  "rules": { "field": { "dn": "CN=my-spring-client" } },
  "enabled": true
}
'
  1. Spring项目中配置SSL上下文同时加载信任库(CA证书)和密钥库(客户端证书):
@Bean
public RestHighLevelClient elasticsearchClient() throws Exception {
    // 加载CA证书(同方式一)
    CertificateFactory factory = CertificateFactory.getInstance("X.509");
    ClassPathResource caResource = new ClassPathResource("http_ca.crt");
    Certificate caCert = factory.generateCertificate(caResource.getInputStream());
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
    trustStore.load(null);
    trustStore.setCertificateEntry("elasticsearch-ca", caCert);

    // 加载客户端密钥库
    ClassPathResource keyStoreResource = new ClassPathResource("client.jks");
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(keyStoreResource.getInputStream(), "密钥库密码".toCharArray());

    // 构建SSL上下文
    SSLContext sslContext = SSLContexts.custom()
            .loadTrustMaterial(trustStore, null)
            .loadKeyMaterial(keyStore, "密钥库密码".toCharArray())
            .build();

    // 构建RestHighLevelClient
    RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "https"))
            .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
                    .setSSLContext(sslContext));

    return new RestHighLevelClient(builder);
}

内容的提问来源于stack exchange,提问作者betaros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:31:03