Elasticsearch(带X-Pack)与Spring本地部署及证书连接问题
Spring连接Elasticsearch 8.2.2(带X-Pack)的证书选择与权限配置
核心需求对应凭证说明
要实现带超级权限(创建角色映射等)的SSL连接,你需要两类关键凭证:
- HTTP层CA根证书:用于Spring客户端验证Elasticsearch服务端的HTTPS身份,对应首次启动生成的
http_ca.crt文件(默认存放在Elasticsearch的config/certs目录下)。 - 超级权限身份凭证:执行高权限操作必须拥有
superuser角色权限,有两种实现方式:- 内置超级用户
elastic的用户名+密码:首次启动时Elasticsearch会生成该用户的初始密码(可在启动日志中查看,或用elasticsearch-reset-password命令重置)。 - 客户端证书认证:通过生成客户端证书并绑定到
superuser角色实现无密码登录,配置相对复杂但更安全。
- 内置超级用户
Spring项目配置步骤(以RestHighLevelClient为例)
方式一:CA证书+elastic用户名密码(推荐,配置简单)
- 将
http_ca.crt复制到Spring项目的src/main/resources目录下。 - 配置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); }
- 验证权限:通过该客户端调用角色映射创建API(如
client.security().putRoleMapping(...)),即可执行超级权限操作。
方式二:客户端证书认证(无密码登录)
- 生成客户端证书:执行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
- 配置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 } '
- 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
相关产品推荐
相关产品推荐

