Вы можете получить доступ к кластеру CSS с помощью Spring Boot. Spring Boot может подключаться к кластеру любым из следующих способов:
Для получения подробной информации о том, как использовать Spring Boot, см. официальную документацию: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/
7.10.2 указывает версию клиента Elasticsearch Java.
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.5</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.10.2</version></dependency></dependencies>
Этот сценарий применим к кластерам в режиме без безопасности или кластерам в режиме безопасности+HTTP.
Файл конфигурации:
1234elasticsearch.url=host1:9200,host2:9200// Вам не нужно настраивать следующие две строки для кластера без безопасности.elasticsearch.имя пользователя=имя пользователяelasticsearch.пароль=пароль
Параметр | Описание |
|---|---|
Хост | IP адрес для доступа к кластеру Elasticsearch. |
имя пользователя | Имя пользователя для доступа к кластеру. |
пароль | Пароль пользователя. |
Код:
12345678910111213141516171819202122232425262728293031323334353637383940414243пакет com.xxx.configuration;import org.elasticsearch.client.RestHighLevelClient;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.data.elasticsearch.client.ClientConfiguration;import org.springframework.data.elasticsearch.client.RestClients;import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;@Configuration@EnableElasticsearchRepositories(basePackages = "com.xxx.repository")@ComponentScan(basePackages = "com.xxx")public class Config extends AbstractElasticsearchConfiguration {@Value("${elasticsearch.url}")public String elasticsearchUrl;// Для кластера без безопасности вам не нужно задавать следующие два параметра.@Value("${elasticsearch.username}")public String elasticsearchUsername;@Value("${elasticsearch.password}")public String elasticsearchPassword;@Override@Beanpublic RestHighLevelClient elasticsearchClient() {final ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo(StringHostParse(elasticsearchUrl))// Для кластера без обеспечения безопасности нет необходимости настраивать withBasicAuth..withBasicAuth(elasticsearchUsername, elasticsearchPassword).build();return RestClients.create(clientConfiguration).rest();}private String[] StringHostParse(String hostAndPorts) {return hostAndPorts.split(",");}}
Вы можете подключиться к кластеру в режиме безопасности + HTTPS без использования какого‑либо сертификата безопасности.
Файл конфигурации:
123elasticsearch.url=host1:9200,host2:9200elasticsearch.имя пользователя=имя пользователяelasticsearch.пароль=пароль
Параметр | Описание |
|---|---|
хост | IP-адрес для доступа к кластеру Elasticsearch. |
имя пользователя | Имя пользователя для доступа к кластеру. |
пароль | Пароль пользователя. |
Код:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071package com.xxx.configuration;import org.elasticsearch.client.RestHighLevelClient;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.data.elasticsearch.client.ClientConfiguration;import org.springframework.data.elasticsearch.client.RestClients;import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;import java.security.KeyManagementException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSession;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;@Configuration@EnableElasticsearchRepositories(basePackages = "com.xxx.repository")@ComponentScan(basePackages = "com.xxx")public class Config extends AbstractElasticsearchConfiguration {@Value("${elasticsearch.url}")public String elasticsearchUrl;@Value("${elasticsearch.username}")public String elasticsearchUsername;@Value("${elasticsearch.password}")public String elasticsearchPassword;@Override@Beanpublic RestHighLevelClient elasticsearchClient() {SSLContext sc = null;try {sc = SSLContext.getInstance("SSL");sc.init(null, trustAllCerts, new SecureRandom());} catch (KeyManagementException | NoSuchAlgorithmException e) {e.printStackTrace();}final ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo(StringHostParse(elasticsearchUrl)).usingSsl(sc, new NullHostNameVerifier()).withBasicAuth(elasticsearchUsername, elasticsearchPassword).build();return RestClients.create(clientConfiguration).rest();}private String[] StringHostParse(String hostAndPorts) {return hostAndPorts.split(",");}public static TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return null;}}};public static class NullHostNameVerifier implements HostnameVerifier {@Overridepublic boolean verify(String arg0, SSLSession arg1) {return true;}}}
Вы можете использовать сертификат безопасности для подключения к кластеру в режиме безопасности + HTTPS.
123elasticsearch.url=host1:9200,host2:9200elasticsearch.имя пользователя=имя пользователяelasticsearch.пароль=пароль
Параметр | Описание |
|---|---|
Хост | IP-адрес для доступа к кластеру Elasticsearch. |
имя пользователя | Имя пользователя для доступа к кластеру. |
пароль | Пароль пользователя. |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596пакет com.xxx.configuration;import org.elasticsearch.client.RestHighLevelClient;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.data.elasticsearch.client.ClientConfiguration;import org.springframework.data.elasticsearch.client.RestClients;import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.security.KeyStore;import java.security.SecureRandom;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSession;import javax.net.ssl.TrustManager;import javax.net.ssl.TrustManagerFactory;import javax.net.ssl.X509TrustManager;@Configuration@EnableElasticsearchRepositories(basePackages = "com.xxx.repository")@ComponentScan(basePackages = "com.xxx")public class Config extends AbstractElasticsearchConfiguration {@Value("${elasticsearch.url}")public String elasticsearchUrl;@Value("${elasticsearch.username}")public String elasticsearchUsername;@Value("${elasticsearch.password}")public String elasticsearchPassword;@Override@Beanpublic RestHighLevelClient elasticsearchClient() {SSLContext sc = null;try {TrustManager[] tm = {new MyX509TrustManager(certFilePath, certPassword)};sc = SSLContext.getInstance("SSL", "SunJSSE");sc.init(null, tm, new SecureRandom());} catch (Exception e) {e.printStackTrace();}final ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo(StringHostParse(elasticsearchUrl)).usingSsl(sc, new NullHostNameVerifier()).withBasicAuth(elasticsearchUsername, elasticsearchPassword).build();return RestClients.create(clientConfiguration).rest();}private String[] StringHostParse(String hostAndPorts) {return hostAndPorts.split(",");}public static class MyX509TrustManager implements X509TrustManager {X509TrustManager sunJSSEX509TrustManager;MyX509TrustManager(String certFilePath, String certPassword) throws Exception {File file = new File(certFilePath);if (!file.isFile()) {throw new Exception("Неправильный путь сертификата");}System.out.println("Загрузка KeyStore " + file + "...");InputStream in = new FileInputStream(file);KeyStore ks = KeyStore.getInstance("JKS");ks.load(in, certPassword.toCharArray());TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509", "SunJSSE");tmf.init(ks);TrustManager[] tms = tmf.getTrustManagers();for (TrustManager tm : tms) {if (tm instanceof X509TrustManager) {sunJSSEX509TrustManager = (X509TrustManager) tm;return;}}throw new Exception("Couldn't initialize");}@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}}public static class NullHostNameVerifier implements HostnameVerifier {@Overridepublic boolean verify(String arg0, SSLSession arg1) {return true;}}}
В предыдущей команде, certFilePath и certPassword указывают путь и пароль к сертификату .jks соответственно.
Для доступа к кластеру Elasticsearch в режиме безопасности, использующему HTTPS, необходимо загрузить сертификат безопасности. Выполните следующие шаги, чтобы получить сертификат безопасности и загрузить его в клиент:
keytool -import -alias newname -keystore ./truststore.jks -file ./CloudSearchService.cer
keytool -import -alias newname -keystore .\truststore.jks -file .\CloudSearchService.cer
В предыдущей команде, newname указывает имя сертификата, определённого пользователем.
После выполнения этой команды вам будет предложено задать пароль сертификата и подтвердить его. Надёжно сохраните пароль. Он будет использоваться для доступа к кластеру.