当前位置: 首页 > 知识库问答 >
问题:

如何将“Spring boot 2.1 with elasticsearch 6.6”与集群节点“https”连接起来?

章稳
2023-03-14

我正在做一个涉及模糊搜索的新项目,所以我也在用spring boot(v2.1.5)做elasticsearch(v6.4.3)。我无法在spring boot与elasticsearch之间建立连接,因为我必须将用户名、密码、ca_certificate_base64从spring boot传递到elasticsearch才能建立连接。你能让我知道我如何建立连接和什么elasticsearch客户端是正确的选项吗?一个示例或链接会很有帮助。

在本地(我的笔记本电脑),我确实安装了ElasticSearch6和spring Boot2.1.5。我能够建立连接(使用spring数据),因为不需要'https'连接,或者传递用户名和密码,因为internet中的大多数示例都是关于localhost:9200的。

   public Client client() {
     Settings elasticsearchSettings = Settings.builder()
           .put("client.transport.sniff", true)
           .put("uri", "https://usertemp:ABCSAD@alp-usba-north-3-portal.11.db2lay.com:32117/")
           .put("uri_direct_1", "https://usertemp:ABCSAD@alp-usba-north-3-portal.11.db2lay.com:32117/")
           .put("cluster.name", clusterName).build();
      TransportClient client = new PreBuiltTransportClient(elasticsearchSettings);
}


I also tried to update application.properties file
'''
spring.data.elasticsearch.cluster-name=ee842f-93042
spring.data.elasticsearch.cluster-nodes=alp-usba-north-3-portal.11.db2lay.com:32117
spring.data.elasticsearch.properties.username=usertemp
spring.data.elasticsearch.properties.password=ABCSAD
spring.data.elasticsearch.properties.ca_certificate_base64=SUZJQ0FURS0tLS0tCk1JSURvekNDQW91Z0F3SUJBZ0lFWFA5Sjl6QU5CZ2

我期待与Spring靴和弹性搜索的联系。但是,当我启动应用程序服务器时,得到以下错误。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.elasticsearch.client.transport.TransportClient]: Factory method 'elasticsearchClient' threw exception; nested exception is java.lang.IllegalArgumentException: unknown setting [password] please check that any required plugins are installed, or check the breaking changes documentation for removed settings
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    ... 96 common frames omitted
Caused by: java.lang.IllegalArgumentException: unknown setting [password] please check that any required plugins are installed, or check the breaking changes documentation for removed settings
    at org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:393) ~[elasticsearch-6.4.3.jar:6.4.3] 

共有1个答案

张翰音
2023-03-14

正如我在评论中已经提到的,我不知道IBM Compose for Elasticsearch到底是如何设置连接安全性的;此方案的设置如下:

  • 在我的计算机上运行ElasticSearch 6.6.2
  • 在Elasticsearch前面作为代理运行的NGINX
    • 基本身份验证已激活
    • 仅SSL
    • 需要SSL客户端证书

    为了能够通过HTTPS通信,您需要使用RestClient,它在Spring Data Elasticsearch 3.2版(目前在3.2.0.m4版中可用)中提供。Spring Boot 2.1.5拉入Spring Data Elasticsearch 3.1.8,因此您需要覆盖该版本。您还需要指定Elasticsearch版本以匹配Spring Boot数据3.2.0.m4,因此您的pom.xml需要以下条目:

    <properties>
        <java.version>1.8</java.version>
        <elasticsearch.version>6.7.2</elasticsearch.version>
        <spring-data-elasticsearch>3.2.0.M4</spring-data-elasticsearch>
    </properties>
    
    <repositories>
        <repository>
            <id>spring-libs-snapshot</id>
            <name>Spring Snapshot Repository</name>
            <url>https://repo.spring.io/libs-milestones</url>
        </repository>
    </repositories>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>${spring-data-elasticsearch}</version>
        </dependency>
    </dependencies>
    
    @Configuration
    public class RestClientConfig extends AbstractElasticsearchConfiguration {
    
        private static final Logger LOG = LoggerFactory.getLogger(RestClientConfig.class);
    
        private static final String CERT_FILE = "client.p12";
        private static final String CERT_PASSWORD = "topsecret";
        private static final String USER_NAME = "user";
        private static final String USER_PASS = "password";
    
        @Override
        public RestHighLevelClient elasticsearchClient() {
    
            final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                    .connectedTo("localhost:443")  // set the address of the Elasticsearch cluster
                    .usingSsl(createSSLContext())  // use the SSLContext with the client cert
                    .withBasicAuth(USER_NAME, USER_PASS)   // use the headers for authentication
                    .build();
    
            return RestClients.create(clientConfiguration).rest();
        }
    
        private SSLContext createSSLContext() {
            try {
                SSLContext sslContext = SSLContext.getInstance("TLS");
    
                KeyManager[] keyManagers = getKeyManagers();
    
                sslContext.init(keyManagers, null, null);
    
                return sslContext;
            } catch (Exception e) {
                LOG.error("cannot create SSLContext", e);
            }
            return null;
        }
    
        private KeyManager[] getKeyManagers()
                throws KeyStoreException, NoSuchAlgorithmException, IOException, CertificateException, UnrecoverableKeyException {
            try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(CERT_FILE)) {
                KeyStore clientKeyStore = KeyStore.getInstance("PKCS12");
                clientKeyStore.load(inputStream, CERT_PASSWORD.toCharArray());
    
                KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
                kmf.init(clientKeyStore, CERT_PASSWORD.toCharArray());
                return kmf.getKeyManagers();
            }
        }
    
        @Bean
        @Primary
        public ElasticsearchOperations elasticsearchTemplate() {
            return elasticsearchOperations();
        }
    }
    

    您可能需要调整getKeyManager()方法中的代码以匹配Compose中的代码,但这应该为您提供了一个起点。

 类似资料:
  • 我的EKS集群变得不健康,因为所有豆荚都有“容器创建”错误,这可能与CNI问题有关。 在版本1.5.5中,conflist文件的位置更改为/etc/cni/10-aws.conflist,但节点仍然处于“notready”状态。 我的EKS版本是1.14,平台版本是EKS.2。 Ipamd日志: 有人对这个问题有什么线索吗?

  • 我使用他们的web UI在EMR上创建了一个AWS Spark2.2集群(这里是新手)。我知道我需要连接到主节点,以便开始发出pyspark命令来学习Spark。但是,当我尝试连接到主节点时,它给我一个错误。在浏览了internet之后,我发现使用可能有助于调试正在进行的操作,但我找不到任何有用的信息。下面是我的ssh调试日志。 有人能指出这里的问题是什么吗?编辑:我已经尝试过将端口22添加到安全

  • 由于单个redis实例不符合我的要求,我选择了redis cluster。我用三个节点组成集群,并将数据填充到集群中。当我使用JedisCluster从集群获取数据时,它比单个实例花费更多的时间。那么,将绝地与redis星系团连接起来的正确方式是什么呢。我如何利用连接池将绝地与redis集群连接起来?

  • 我是AWS云前线和AWS的新手。我有一个Next.js(反应SSR框架)网站,我部署到AWS使用(https://github.com/serverless-nextjs/serverless-next.js)。然而,我也需要一些缓存的Web应用程序。我决定使用来自AWS的redis ElastiCache。我在AWS控制台上创建了一个redis弹性缓存集群。 我的尝试: 我设置了连接redis

  • 我正在制作托管在heroku上的NodeJS应用程序并使用MongoDB地图集作为后端。当我通过POSTMAN向应用程序发送POST请求时,它显示: 在我看来,节点应用程序无法连接到MongoDB地图集集群。如果是这样,那么我如何将其与MongoDB连接。 谢谢

  • 我不知道如何通过N连接到AWS的ElastiCache Redisode.js.我已经成功地通过node_redisNPM连接到主主机(001),但是我无法使用ioredis的集群能力,因为显然ElastiCache没有实现CLUSTER命令。 我认为必须有另一种方法,但用于节点的AWS SDK只有用于管理ElastiCache的命令,而不是用于实际连接到ElastiCache的命令。 如果不使用