简体   繁体   English

无法使用Java API和Shield连接到ElasticSearch服务器

[英]Can't connect to ElasticSearch server using Java API and shield

I am trying to connect to my Elasticsearch server using the Java Api and shield. 我正在尝试使用Java Api和shield连接到我的Elasticsearch服务器。 I can execute index, get, delete and search operations on the existing cluster using sense plugin (eg) and via curl on 9200. I've seen other threads about this but none of them worked and none of them were trying to connect to a Elasticsearch webserver with shield. 我可以使用感测插件(例如)并通过9200上的curl在现有群集上执行索引,获取,删除和搜索操作。带屏蔽的Elasticsearch Web服务器

I used the same API to connect with my localhost of elasticsearch and it worked fine however when I try to connect with my web server I always get the same error: 我使用相同的API连接我的Elasticsearch本地主机,并且工作正常,但是当我尝试连接Web服务器时,总是会遇到相同的错误:

Error 错误

1342 [main] DEBUG org.elasticsearch.shield.transport.netty  - [Benjamin Jacob Grimm] connected to node [{#transport#-1}{HOST_IP}{HOST/HOST_IP:9300}]
1431 [elasticsearch[Benjamin Jacob Grimm][generic][T#1]] DEBUG org.elasticsearch.shield.transport.netty  - [Benjamin Jacob Grimm] disconnecting from [{#transport#-1}{HOST_IP}{HOST/HOST_IP:9300}], channel closed event
1463 [main] INFO org.elasticsearch.client.transport  - [Benjamin Jacob Grimm] failed to get node info for {#transport#-1}{HOST_IP}{HOST/HOST_IP:9300}, disconnecting...
NodeDisconnectedException[[][HOST/HOST_IP:9300][cluster:monitor/nodes/liveness] disconnected]

...9200/_nodes ... 9200 / _nodes

"cluster_name": "elasticsearch",
   "nodes": {
      "UYdZbCQKQZavtFYOoUpawg": {
         "name": "Desmond Pitt",
         "transport_address": "HOST_IP:9300",
         "host": "HOST_IP",
         "ip": "HOST_IP",
         "version": "2.3.3",
         "build": "218bdf1",
         "http_address": "HOST_IP:9200",
         "settings": {
            "pidfile": "/var/run/elasticsearch/elasticsearch.pid",
            "cluster": {
               "name": "elasticsearch"
            },
            "path": {
               "conf": "/etc/elasticsearch",
               "data": "/var/lib/elasticsearch",
               "logs": "/var/log/elasticsearch",
               "home": "/usr/share/elasticsearch"
            },
            "shield": {
               "http": {
                  "ssl": "true"
               },
               "https": {
                  "ssl": "true"
               },
               "transport": {
                  "ssl": "true"
               }
            },
            "name": "Desmond Pitt",
            "client": {
               "type": "node"
            },
            "http": {
               "cors": {
                  "allow-origin": "*",
                  "allow-headers": "Authorization, Origin, X-Requested-With, Content-Type, Accept",
                  "allow-credentials": "true",
                  "allow-methods": "OPTIONS, HEAD, GET, POST, PUT, DELETE",
                  "enabled": "true"
               }
            },
            "index": {
               "queries": {
                  "cache": {
                     "type": "opt_out_cache"
                  }
               }
            },
            "foreground": "false",
            "config": {
               "ignore_system_properties": "true"
            },
            "network": {
               "host": "HOST_IP",
               "bind_host": "0.0.0.0",
               "publish_host": "HOST_IP"
            }
         }

Java code: Java代码:

TransportClient client = TransportClient.builder()
    .addPlugin(ShieldPlugin.class)
    .settings(Settings.builder()
        .put("cluster.name", ClusterName)
        .put("shield.user", "USER:PASSWORD")
        .build())
    .build()
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(HOST), 9300));

I've tried as stated on Can't connect to ElasticSearch server using Java API to sync my Java API java version and my server and currently i'm using: 我已经尝试按照``无法使用Java API连接到ElasticSearch服务器来同步我的Java API Java版本和服务器''中的说明进行操作,目前我正在使用:

Java API: Java API:

C:\Program Files\Java\jdk1.8.0_92

Server: 服务器:

"version": "1.8.0_91",
"vm_name": "OpenJDK 64-Bit Server VM",

I don't know if it has any problem using ...0_91 and 0_92 but doesn't seem to make any difference because the java API works weel on my localhost server. 我不知道使用... 0_91和0_92是否有任何问题,但似乎没有什么区别,因为java API在我的本地主机服务器上工作正常。

If you need more information feel free to ask. 如果您需要更多信息,请随时询问。 Thanks in advance! 提前致谢!

UPDATE: 更新:

Changes I did in elasticsearch.yml 我在elasticsearch.yml中所做的更改

shield.ssl.keystore.path:          /usr/share/elasticsearch/bin/shield/elastic.jks
shield.ssl.keystore.password:      password
shield.ssl.keystore.key_password:  password

shield.transport.ssl: true
shield.http.ssl: true
shield.https.ssl: true

network.host: HOST_IP
network.publish_host: HOST_IP
shield.ssl.hostname_verification.resolve_name: false

Result of https://HOST:9200/_cluster/health?pretty=true https:// HOST:9200 / _cluster / health?pretty = true的结果

{
   "cluster_name": "elasticsearch",
   "status": "yellow",
   "timed_out": false,
   "number_of_nodes": 1,
   "number_of_data_nodes": 1,
   "active_primary_shards": 5,
   "active_shards": 5,
   "relocating_shards": 0,
   "initializing_shards": 0,
   "unassigned_shards": 5,
   "delayed_unassigned_shards": 0,
   "number_of_pending_tasks": 0,
   "number_of_in_flight_fetch": 0,
   "task_max_waiting_in_queue_millis": 0,
   "active_shards_percent_as_number": 50
}

UPDATE2: UPDATE2:

I've tried activate SSL according to official documentation and I got the following errors: 我尝试根据官方文档激活SSL,但遇到以下错误:

2082 [elasticsearch[Steel Serpent][transport_client_worker][T#1]{New I/O worker #1}] DEBUG org.elasticsearch.shield.transport.netty  - [Steel Serpent] SSL/TLS handshake failed, closing channel: null
java.nio.channels.ClosedChannelException
    at org.jboss.netty.handler.ssl.SslHandler.channelDisconnected(SslHandler.java:575)
    at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:102)
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
    at org.jboss.netty.channel.Channels.fireChannelDisconnected(Channels.java:396)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.close(AbstractNioWorker.java:360)
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:93)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108)
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89)
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
    at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
    at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Temporary Solution 临时解决方案

After that try I did as Vladislav Kysliy suggested and disabled SSL and it worked but I'm looking for a real solution and not a temporary one. 在尝试之后,我按照Vladislav Kysliy的建议进行了操作,并禁用了SSL,它可以正常工作,但我正在寻找一种真正的解决方案,而不是临时的解决方案。

As i can see you enabled SSL encryption. 如我所见,您启用了SSL加密。 But your java code didn't activate SSL. 但是您的Java代码没有激活SSL。 According official documentation you should use something like this: 根据官方文档,您应该使用以下内容:

TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(Settings.builder()
    .put("cluster.name", "myClusterName")
    .put("shield.user", "transport_client_user:changeme")
    .put("shield.ssl.keystore.path", "/path/to/client.jks") (1)
    .put("shield.ssl.keystore.password", "password")
    .put("shield.transport.ssl", "true")
    ...
    .build())

Moreover i would test my code without any encryption and add some new features(eg SSL) to config and code step by step. 此外,我将在不进行任何加密的情况下测试我的代码,并逐步添加一些新功能(例如SSL)进行配置和编码。

UPD: To be honest remotely fixing ssl issues will be tricky. UPD:说实话,远程解决ssl问题非常棘手。 This errors often appeared when client sends an invalid SSL certificate. 客户端发送无效的SSL证书时,通常会出现此错误。 Probably you need to disable client auth 可能您需要禁用客户端身份验证

Because of you use SSL + Shield the main idea is check your functionality step-by-step: disable SSL - check in Java -API client, enable SSL - check again. 因为您使用SSL + Shield,所以主要的想法是逐步检查功能:禁用SSL-在Java -API客户端中签入,启用SSL-再次检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 无法使用Java API连接到ElasticSearch服务器 - Can't connect to ElasticSearch server using Java API 为什么我不能通过Java API连接到ElasticSearch? - Why can't I connect to ElasticSearch through Java API? 无法使用 Java API 连接到在本地虚拟机上运行的 ElasticSearch Docker 集群 - Can't connect to ElasticSearch Docker cluster which run on local virtual machine using Java API Elasticsearch:java.lang.InternalError:无法连接到窗口服务器 - Elasticsearch: java.lang.InternalError: Can't connect to window server Elasticsearch Java客户端:无法连接到远程服务器 - Elasticsearch Java client: can't connect to the remote server Elasticsearch:安装防护罩后无法使用python连接 - Elasticsearch : Cannot connect using python when shield is installed 如何使用elasticsearch Java API连接位于不同服务器上的多个节点? - How to connect multiple nodes located on different server with the elasticsearch java api? 使用 java 连接 Elasticsearch - Connect Elasticsearch using java 无法使用本地机器的 IP 地址连接到远程 ElasticSearch 服务器 - Can't connect to remote ElasticSearch server using local machine's IP Address 无法在Shield Elasticsearch中添加管理员-[错误]找不到或加载主类org.elasticsearch.shield.authc.esusers.tool.ESUsersTool - Can't add admin in Shield Elasticsearch - [Error]Could not find or load main class org.elasticsearch.shield.authc.esusers.tool.ESUsersTool
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM