# Connection Closed Error

**URL:** <https://discuss.elastic.co/t/connection-closed-error/310980>\
**Category:** Elasticsearch\
**Tags:** elastic-stack-security, docker, language-clients\
**Created:** [July 29, 2022, 11:28am UTC](https://discuss.elastic.co/t/connection-closed-error/310980 "2022-07-29T11:28:11Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Reskun](https://avatars.discourse-cdn.com/v4/letter/r/e274bd/32.png) [@Reskun](https://discuss.elastic.co/u/Reskun)\
**Post date:** [July 29, 2022, 11:28am UTC](https://discuss.elastic.co/t/connection-closed-error/310980/1 "2022-07-29T11:28:11Z")

</div>

Hi I've successfully created a multinode elasticsearch cluster using a docker-compose.yml file by following the steps in the link: [Install Elasticsearch with Docker | Elasticsearch Guide [8.3] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html)

![image](https://us1.discourse-cdn.com/elastic/original/3X/7/2/728347e5554bc651abad45e38f6e93d1d1d46d5a.png)

localhost:9200 required me to enter a username and password  
username: elastic  
password: password

Java Program Setup:  
My pom.xml looks like:

```auto
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Elasticsearch_Java_Program</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>18</maven.compiler.source>
        <maven.compiler.target>18</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.9.2</version><!--$NO-MVN-MAN-VER$-->
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.1</version>
        </dependency>
    </dependencies>

</project>

```

My Main class looks like:

```auto
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentType;

import java.io.IOException;
import java.time.LocalDate;

public class Main{
    public static void main(String args[]) throws IOException //static method
    {
        //Connecting to Elasticsearch
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials("elastic", "password"));

        RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                });

        RestHighLevelClient client = new RestHighLevelClient(builder);

        //Creating New Index into ElasticSearch
        CreateIndexRequest request = new CreateIndexRequest("sampleIndex");
        request.settings(Settings.builder().put("index.number_of_shards", 1).put("index.number_of_replicas", 2));
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        System.out.println("response id: " + createIndexResponse.index());

        //Inserting to ElasticSearch
        EmployeePojo emp = new EmployeePojo("Elon", "Musk", LocalDate.now() );

        IndexRequest indexRequest = new IndexRequest("sampleIndex");
        indexRequest.id("003");
        indexRequest.source(new ObjectMapper().writeValueAsString(emp), XContentType.JSON);
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println("response id: "+indexResponse.getId());
        System.out.println("response name: "+indexResponse.getResult().name());

    }

}

```

My Person class looks like:

```auto
import java.time.LocalDate;

public class EmployeePojo {
    public String firstName;
    public String lastName;
    private LocalDate startDate;

    public EmployeePojo(String firstName, String lastName, LocalDate startDate) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.startDate = startDate;
    }

    public String name() {
        return this.firstName + " " + this.lastName;
    }

    public LocalDate getStart() {
        return this.startDate;
    }
}

```

The output when run is:

```auto
/home/steven/.jdks/openjdk-18.0.2/bin/java -javaagent:/snap/intellij-idea-community/381/lib/idea_rt.jar=45065:/snap/intellij-idea-community/381/bin -Dfile.encoding=UTF-8 -classpath /home/steven/IdeaProjects/Elasticsearch_Java_Program/target/classes:/home/steven/.m2/repository/org/elasticsearch/client/elasticsearch-rest-high-level-client/7.9.2/elasticsearch-rest-high-level-client-7.9.2.jar:/home/steven/.m2/repository/org/elasticsearch/plugin/mapper-extras-client/7.9.2/mapper-extras-client-7.9.2.jar:/home/steven/.m2/repository/org/elasticsearch/plugin/parent-join-client/7.9.2/parent-join-client-7.9.2.jar:/home/steven/.m2/repository/org/elasticsearch/plugin/aggs-matrix-stats-client/7.9.2/aggs-matrix-stats-client-7.9.2.jar:/home/steven/.m2/repository/org/elasticsearch/plugin/rank-eval-client/7.9.2/rank-eval-client-7.9.2.jar:/home/steven/.m2/repository/org/elasticsearch/plugin/lang-mustache-client/7.9.2/lang-mustache-client-7.9.2.jar:/home/steven/.m2/repository/com/github/spullara/mustache/java/compiler/0.9.6/compiler-0.9.6.jar:/home/steven/.m2/repository/org/elasticsearch/client/elasticsearch-rest-client/7.9.2/elasticsearch-rest-client-7.9.2.jar:/home/steven/.m2/repository/org/apache/httpcomponents/httpclient/4.5.10/httpclient-4.5.10.jar:/home/steven/.m2/repository/org/apache/httpcomponents/httpcore/4.4.12/httpcore-4.4.12.jar:/home/steven/.m2/repository/org/apache/httpcomponents/httpasyncclient/4.1.4/httpasyncclient-4.1.4.jar:/home/steven/.m2/repository/org/apache/httpcomponents/httpcore-nio/4.4.12/httpcore-nio-4.4.12.jar:/home/steven/.m2/repository/commons-codec/commons-codec/1.11/commons-codec-1.11.jar:/home/steven/.m2/repository/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar:/home/steven/.m2/repository/org/elasticsearch/elasticsearch/7.9.2/elasticsearch-7.9.2.jar:/home/steven/.m2/repository/org/elasticsearch/elasticsearch-core/7.9.2/elasticsearch-core-7.9.2.jar:/home/steven/.m2/repository/org/elasticsearch/elasticsearch-secure-sm/7.9.2/elasticsearch-secure-sm-7.9.2.jar:/home/steven/.m2/repository/org/elasticsearch/elasticsearch-x-content/7.9.2/elasticsearch-x-content-7.9.2.jar:/home/steven/.m2/repository/org/yaml/snakeyaml/1.26/snakeyaml-1.26.jar:/home/steven/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-smile/2.10.4/jackson-dataformat-smile-2.10.4.jar:/home/steven/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.10.4/jackson-dataformat-yaml-2.10.4.jar:/home/steven/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.10.4/jackson-dataformat-cbor-2.10.4.jar:/home/steven/.m2/repository/org/elasticsearch/elasticsearch-geo/7.9.2/elasticsearch-geo-7.9.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-core/8.6.2/lucene-core-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-analyzers-common/8.6.2/lucene-analyzers-common-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-backward-codecs/8.6.2/lucene-backward-codecs-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-grouping/8.6.2/lucene-grouping-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-highlighter/8.6.2/lucene-highlighter-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-join/8.6.2/lucene-join-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-memory/8.6.2/lucene-memory-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-misc/8.6.2/lucene-misc-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-queries/8.6.2/lucene-queries-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-queryparser/8.6.2/lucene-queryparser-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-sandbox/8.6.2/lucene-sandbox-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-spatial-extras/8.6.2/lucene-spatial-extras-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-spatial3d/8.6.2/lucene-spatial3d-8.6.2.jar:/home/steven/.m2/repository/org/apache/lucene/lucene-suggest/8.6.2/lucene-suggest-8.6.2.jar:/home/steven/.m2/repository/org/elasticsearch/elasticsearch-cli/7.9.2/elasticsearch-cli-7.9.2.jar:/home/steven/.m2/repository/net/sf/jopt-simple/jopt-simple/5.0.2/jopt-simple-5.0.2.jar:/home/steven/.m2/repository/com/carrotsearch/hppc/0.8.1/hppc-0.8.1.jar:/home/steven/.m2/repository/joda-time/joda-time/2.10.4/joda-time-2.10.4.jar:/home/steven/.m2/repository/com/tdunning/t-digest/3.2/t-digest-3.2.jar:/home/steven/.m2/repository/org/hdrhistogram/HdrHistogram/2.1.9/HdrHistogram-2.1.9.jar:/home/steven/.m2/repository/org/apache/logging/log4j/log4j-api/2.11.1/log4j-api-2.11.1.jar:/home/steven/.m2/repository/org/elasticsearch/jna/5.5.0/jna-5.5.0.jar:/home/steven/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.11.1/jackson-databind-2.11.1.jar:/home/steven/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.11.1/jackson-annotations-2.11.1.jar:/home/steven/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.11.1/jackson-core-2.11.1.jar Main
Exception in thread "main" org.apache.http.ConnectionClosedException: Connection is closed
	at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:839)
	at org.elasticsearch.client.RestClient.performRequest(RestClient.java:259)
	at org.elasticsearch.client.RestClient.performRequest(RestClient.java:246)
	at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1613)
	at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1583)
	at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1553)
	at org.elasticsearch.client.IndicesClient.create(IndicesClient.java:316)
	at Main.main(Main.java:45)
Caused by: org.apache.http.ConnectionClosedException: Connection is closed
	at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.endOfInput(HttpAsyncRequestExecutor.java:356)
	at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:261)
	at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
	at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
	at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114)
	at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
	at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
	at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591)
	at java.base/java.lang.Thread.run(Thread.java:833)

```

If it helps below are the .env and docker-compose.yml files used to create the elasticsearch cluster:  
.env:

```auto

# Password for the 'elastic' user (at least 6 characters)
ELASTIC_PASSWORD=password

# Password for the 'kibana_system' user (at least 6 characters)
KIBANA_PASSWORD=password

# Version of Elastic products
STACK_VERSION=8.3.3

# Set the cluster name
CLUSTER_NAME=docker-cluster

# Set to 'basic' or 'trial' to automatically start the 30-day trial
LICENSE=basic
#LICENSE=trial

# Port to expose Elasticsearch HTTP API to the host
ES_PORT=9200
#ES_PORT=127.0.0.1:9200

# Port to expose Kibana to the host
KIBANA_PORT=5601
#KIBANA_PORT=80

# Increase or decrease based on the available host memory (in bytes)
MEM_LIMIT=1073741824

# Project namespace (defaults to the current folder name if not set)
#COMPOSE_PROJECT_NAME=myproject

```

docker-compose.yml:

```auto

version: "2.2"

services:
  setup:
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
    user: "0"
    command: >
      bash -c '
        if [x${ELASTIC_PASSWORD} == x]; then
          echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
          exit 1;
        elif [x${KIBANA_PASSWORD} == x]; then
          echo "Set the KIBANA_PASSWORD environment variable in the .env file";
          exit 1;
        fi;
        if [! -f config/certs/ca.zip]; then
          echo "Creating CA";
          bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
          unzip config/certs/ca.zip -d config/certs;
        fi;
        if [! -f config/certs/certs.zip]; then
          echo "Creating certs";
          echo -ne \
          "instances:\n"\
          " - name: es01\n"\
          " dns:\n"\
          " - es01\n"\
          " - localhost\n"\
          " ip:\n"\
          " - 127.0.0.1\n"\
          " - name: es02\n"\
          " dns:\n"\
          " - es02\n"\
          " - localhost\n"\
          " ip:\n"\
          " - 127.0.0.1\n"\
          " - name: es03\n"\
          " dns:\n"\
          " - es03\n"\
          " - localhost\n"\
          " ip:\n"\
          " - 127.0.0.1\n"\
          > config/certs/instances.yml;
          bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
          unzip config/certs/certs.zip -d config/certs;
        fi;
        echo "Setting file permissions"
        chown -R root:root config/certs;
        find . -type d -exec chmod 750 \{\} \;;
        find . -type f -exec chmod 640 \{\} \;;
        echo "Waiting for Elasticsearch availability";
        until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
        echo "Setting kibana_system password";
        until curl -s -X POST --cacert config/certs/ca/ca.crt -u elastic:${ELASTIC_PASSWORD} -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
        echo "All done!";
      '
    healthcheck:
      test: ["CMD-SHELL", "[-f config/certs/es01/es01.crt]"]
      interval: 1s
      timeout: 5s
      retries: 120

  es01:
    depends_on:
      setup:
        condition: service_healthy
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es02,es03
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es01/es01.key
      - xpack.security.http.ssl.certificate=certs/es01/es01.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.http.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es01/es01.key
      - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  es02:
    depends_on:
      - es01
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata02:/usr/share/elasticsearch/data
    environment:
      - node.name=es02
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es01,es03
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es02/es02.key
      - xpack.security.http.ssl.certificate=certs/es02/es02.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.http.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es02/es02.key
      - xpack.security.transport.ssl.certificate=certs/es02/es02.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  es03:
    depends_on:
      - es02
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata03:/usr/share/elasticsearch/data
    environment:
      - node.name=es03
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es01,es02
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es03/es03.key
      - xpack.security.http.ssl.certificate=certs/es03/es03.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.http.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es03/es03.key
      - xpack.security.transport.ssl.certificate=certs/es03/es03.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  kibana:
    depends_on:
      es01:
        condition: service_healthy
      es02:
        condition: service_healthy
      es03:
        condition: service_healthy
    image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
    volumes:
      - certs:/usr/share/kibana/config/certs
      - kibanadata:/usr/share/kibana/data
    ports:
      - ${KIBANA_PORT}:5601
    environment:
      - SERVERNAME=kibana
      - ELASTICSEARCH_HOSTS=https://es01:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
      - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
    mem_limit: ${MEM_LIMIT}
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

volumes:
  certs:
    driver: local
  esdata01:
    driver: local
  esdata02:
    driver: local
  esdata03:
    driver: local
  kibanadata:
    driver: local

```

Please help, I've looked everywhere for an answer but can't find anything.  
If you know of another way to connect my java program to an already existing elasticsearch cluster and allow my java program to add data and search data, I will be happy to look at that as well.

Thanks!

---

<div class="post-metadata">

**Author:** ![Yang\_Wang](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/yang_wang/32/48857_2.png) [@Yang\_Wang](https://discuss.elastic.co/u/Yang_Wang)\
**Post date:** [August 1, 2022, 4:41am UTC](https://discuss.elastic.co/t/connection-closed-error/310980/2 "2022-08-01T04:41:49Z")

</div>

The cluster is version 8.3.3. Therefore I'd recommend using the new official Java Client [GitHub - elastic/elasticsearch-java: Official Elasticsearch Java Client](https://github.com/elastic/elasticsearch-java)

The 7.x High Level Rest Client is deprecated and no new versions are published for 8.x.

---

<div class="post-metadata">

**Author:** ![Reskun](https://avatars.discourse-cdn.com/v4/letter/r/e274bd/32.png) [@Reskun](https://discuss.elastic.co/u/Reskun)\
**Post date:** [August 1, 2022, 9:33am UTC](https://discuss.elastic.co/t/connection-closed-error/310980/3 "2022-08-01T09:33:08Z")

</div>

Unfortunately, this did not solve the original issue 😢 although a good idea I'm still getting the same error.  
The new Main class is:

```auto
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.elasticsearch.client.*;

import java.io.IOException;

public class Main {
    public static void main(String args[]) throws IOException //static method
    {

        RestClient restClient = RestClient.builder(
                new HttpHost("localhost", 9200)).build();

        // Create the transport with a Jackson mapper
        ElasticsearchTransport transport = new RestClientTransport(
                restClient, new JacksonJsonpMapper());

        // And create the API client
        ElasticsearchClient client = new ElasticsearchClient(transport);

        SearchResponse<Product> search = client.search(s -> s
                        .index("products")
                        .query(q -> q
                                .term(t -> t
                                        .field("name")
                                        .value(v -> v.stringValue("bicycle"))
                                )),
                Product.class);

        for (Hit<Product> hit : search.hits().hits()) {
            processProduct(hit.source());
        }
    }

    private static void processProduct(Product p) {
    }

}

```

I've added a Person class as well:

```auto
public class Product {
    private String sku;
    private String name;
    private double price;

    public Product() {}
    public Product(String sku, String name, double price) {
        this.sku = sku;
        this.name = name;
        this.price = price;
    }

    public String getSku() {
        return sku;
    }

    public void setSku(String sku) {
        this.sku = sku;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return this.price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

```

pom.xml is as follows:

```auto
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Elasticsearch_Java_Program</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>18</maven.compiler.source>
        <maven.compiler.target>18</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>co.elastic.clients</groupId>
            <artifactId>elasticsearch-java</artifactId>
            <version>8.3.3</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
        </dependency>
    </dependencies>

</project>

```

The error is still closed connection as shown below:

```auto
Exception in thread "main" org.apache.http.ConnectionClosedException: Connection is closed
	at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:922)
	at org.elasticsearch.client.RestClient.performRequest(RestClient.java:300)
	at org.elasticsearch.client.RestClient.performRequest(RestClient.java:288)
	at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:146)
	at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1502)
	at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1519)
	at Main.main(Main.java:60)
Caused by: org.apache.http.ConnectionClosedException: Connection is closed
	at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.endOfInput(HttpAsyncRequestExecutor.java:356)
	at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:261)
	at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
	at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
	at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114)
	at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
	at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
	at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591)
	at java.base/java.lang.Thread.run(Thread.java:833)

```

As the error is connection closed and not refused, I'm pretty sure there's no issue with the username/password which I truly don;t understand as Elasticsearch requires a username and password even though its clearly never mentioned in the main.  
Is it possible the below image to do with trusted sites could be causing a connection closed?

 ![Screenshot from 2022-08-01 10-22-45](https://us1.discourse-cdn.com/elastic/original/3X/a/1/a1469b2f8869f6fc0ec61af3442bbcd1b090253e.png)

Is there any way to find out/ limit the number of reasons this is happening?

---

<div class="post-metadata">

**Author:** ![Yang\_Wang](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/yang_wang/32/48857_2.png) [@Yang\_Wang](https://discuss.elastic.co/u/Yang_Wang)\
**Post date:** [August 1, 2022, 1:52pm UTC](https://discuss.elastic.co/t/connection-closed-error/310980/4 "2022-08-01T13:52:26Z")

</div>

You need configure both authentication and TLS for your client. Please refer to the docs for the lower level java client (used internally by the official Java client):

- Configure basic authentication [Basic authentication | Elasticsearch Java API Client [8.3] | Elastic](https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/_basic_authentication.html)
- Configure TLS [Encrypted communication | Elasticsearch Java API Client [8.3] | Elastic](https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/_encrypted_communication.html)

---

<div class="post-metadata">

**Author:** ![Reskun](https://avatars.discourse-cdn.com/v4/letter/r/e274bd/32.png) [@Reskun](https://discuss.elastic.co/u/Reskun)\
**Post date:** [August 1, 2022, 3:15pm UTC](https://discuss.elastic.co/t/connection-closed-error/310980/5 "2022-08-01T15:15:46Z")

</div>

I'm attempting to follow your suggestion but I'm a little confused with the trust certification part, the code asks for a path to the trust certificate, either some kinda p12 or http\_ca.crt file. As I mentioned in the original question I only used a docker-compose.yml file and a .env file.  
Do you have any idea where the trust certificate might be located?

Configure TLS [Encrypted communication | Elasticsearch Java API Client [8.3] | Elastic ](https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/_encrypted_communication.html)

EDIT:  
I think I found the file (ca.crt, hopefully thats the file the code wants), by going into the running elasticsearch container and basicall just searching for it, however, I can't seem to copy that file into my local directory to use? You can see the error below:

```auto
sudo docker cp elasticsearchdocker_es01_1:/usr/share/elasticsearch/config/certs/ca/ca.crt .
open /home/steven/Documents/ElasticSearchDocker/ca.crt: permission denied

```

Any idea why I'm getting permission denied and how to solve it?

---

<div class="post-metadata">

**Author:** ![Yang\_Wang](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/yang_wang/32/48857_2.png) [@Yang\_Wang](https://discuss.elastic.co/u/Yang_Wang)\
**Post date:** [August 2, 2022, 1:09am UTC](https://discuss.elastic.co/t/connection-closed-error/310980/6 "2022-08-02T01:09:22Z")

</div>

> [@Reskun](#):
>
> Any idea why I'm getting permission denied and how to solve it?

You can just change the ownship of the file with something like

```auto
sudo chown steven: /home/steven/Documents/ElasticSearchDocker/ca.crt

```

---

<div class="post-metadata">

**Author:** ![Reskun](https://avatars.discourse-cdn.com/v4/letter/r/e274bd/32.png) [@Reskun](https://discuss.elastic.co/u/Reskun)\
**Post date:** [August 2, 2022, 8:19am UTC](https://discuss.elastic.co/t/connection-closed-error/310980/7 "2022-08-02T08:19:03Z")

</div>

So I've updated my main class with credentials and certificate code but the error Error: Connection Closed is still there. Any idea where I might have gone wrong in my code? (Sorry if you saw previous edit, made a simple mistake but fixed it now)

Main class:

```auto
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;
import org.elasticsearch.client.*;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;

public class Main {
    public static void main(String args[]) throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException //static method
    {

        //Accept certificate to use site 9200.
        Path caCertificatePath = Paths.get("/home/steven/Documents/ElasticSearchDocker/ca.crt");
        CertificateFactory factory =
                CertificateFactory.getInstance("X.509");
        Certificate trustedCa;
        try (InputStream is = Files.newInputStream(caCertificatePath)) {
            trustedCa = factory.generateCertificate(is);
        }
        KeyStore trustStore = KeyStore.getInstance("pkcs12");
        trustStore.load(null, null);
        trustStore.setCertificateEntry("ca", trustedCa);
        SSLContextBuilder sslContextBuilder = SSLContexts.custom()
                .loadTrustMaterial(trustStore, null);
        final SSLContext sslContext = sslContextBuilder.build();
        RestClient.builder(
                        new HttpHost("localhost", 9200, "https"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(
                            HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder.setSSLContext(sslContext);
                    }
                });

        //Authentication
        final CredentialsProvider credentialsProvider =
                new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials("elastic", "password"));
        RestClientBuilder builder = RestClient.builder(
                        new HttpHost("localhost", 9200))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(
                            HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder
                                .setSSLContext(sslContext)
                                .setDefaultCredentialsProvider(credentialsProvider);
                    }
                });

        //Connect to https://localhost:9200/
        RestClient restClient = builder.build();

        // Create the transport with a Jackson mapper
        ElasticsearchTransport transport = new RestClientTransport(
                restClient, new JacksonJsonpMapper());

        // And create the API client
        ElasticsearchClient client = new ElasticsearchClient(transport);
        
        SearchResponse<Product> search = client.search(s -> s
                        .index("products")
                        .query(q -> q
                                .term(t -> t
                                        .field("name")
                                        .value(v -> v.stringValue("bicycle"))
                                )),
                Product.class);

        for (Hit<Product> hit : search.hits().hits()) {
            processProduct(hit.source());
        }
    }

    private static void processProduct(Product p) {
    }

}

```

POM.xml and Person class have remained the same.

Output Error:

```auto
Exception in thread "main" java.net.ConnectException: Connection refused
	at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:932)
	at org.elasticsearch.client.RestClient.performRequest(RestClient.java:300)
	at org.elasticsearch.client.RestClient.performRequest(RestClient.java:288)
	at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:146)
	at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1502)
	at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1519)
	at Main.main(Main.java:85)
Caused by: java.net.ConnectException: Connection refused
	at java.base/sun.nio.ch.Net.pollConnect(Native Method)
	at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672)
	at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:946)
	at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvent(DefaultConnectingIOReactor.java:174)
	at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvents(DefaultConnectingIOReactor.java:148)
	at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor.execute(AbstractMultiworkerIOReactor.java:351)
	at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.execute(PoolingNHttpClientConnectionManager.java:221)
	at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase$1.run(CloseableHttpAsyncClientBase.java:64)
	at java.base/java.lang.Thread.run(Thread.java:833)

```

Also the `sudo chown steven: /home/steven/Documents/ElasticSearchDocker/ca.crt` returned no such file exists. I believe this is because its created during the docker cp command so I can't set the permissions like that. I did find a work around though by copying the file to /tmp/ directory and finding it in /tmp/docker.snapshot and just copying and pasting it to a more suitable directory.

---

<div class="post-metadata">

**Author:** ![Jm\_Pop](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jm_pop/32/109730_2.png) [@Jm\_Pop](https://discuss.elastic.co/u/Jm_Pop)\
**Post date:** [August 16, 2022, 4:22pm UTC](https://discuss.elastic.co/t/connection-closed-error/310980/8 "2022-08-16T16:22:50Z")

</div>

For All here it's 1 solution

> **[Trusting All Certificates in OkHttp | Baeldung](https://www.baeldung.com/okhttp-client-trust-all-certificates)**
>
> Learn how to create an OkHttpClient and configure it to trust all certificates — not the best practice in production, but you may need it from time to time during development or testing.

You can get all information with postman.

@Test  
public void should\_get\_info\_from\_elastic\_search() throws IOException, NoSuchAlgorithmException, KeyManagementException {

```
    TrustManager[] trustAllCerts = new TrustManager[]{
            new X509TrustManager() {
                @Override
                public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                }

                @Override
                public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                }

                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return new java.security.cert.X509Certificate[]{};
                }
            }
    };

    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

```

/\* OkHttpClient client = new OkHttpClient().newBuilder()  
.build();\*/  
OkHttpClient.Builder newBuilder = new OkHttpClient.Builder();

```
    newBuilder.writeTimeout(Duration.ofMinutes(5));
    newBuilder.sslSocketFactory(sslContext.getSocketFactory() ,(X509TrustManager)trustAllCerts[0]);

    OkHttpClient client = newBuilder.build();

    MediaType mediaType = MediaType.parse("text/plain");
    RequestBody body = RequestBody.create(mediaType, "");
    Request request = new Request.Builder()
            //.url("https://localhost:9200/pages/_doc/H64mmYIBQe1YmU6F2dHI")
            .url("https://localhost:9200/pageTest/")
            .method("PUT",body)
            .addHeader("Authorization", "Basic ZWxhc3RpYzpyK3FGcWJvWjd4SkYtdWNpcG9zYQ==")
            .build();
    Response response = client.newCall(request).execute();
    ResponseBody data = response.body();
    ObjectMapper objectMapper = new ObjectMapper();
  // ElasticSearchResponse entity = objectMapper.readValue(data.string(), ElasticSearchResponse.class);

    // ElasticSearchResponse
}

```

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [September 13, 2022, 4:23pm UTC](https://discuss.elastic.co/t/connection-closed-error/310980/9 "2022-09-13T16:23:12Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
