为elasticsearch设置自签SSL教程

安装elasticsearch的docker版本,需要设置ssl,但是没有证书,能生成一个自签的证书,然后搭配到elasticsearch,生成相关ssl设置的教程

要在Elasticsearch Docker安装中使用自签名SSL证书,你可以按照以下步骤操作:

步骤 1: 安装 OpenSSL
确保你的系统上安装了OpenSSL。在大多数Linux发行版和MacOS上,OpenSSL通常已经预安装了。如果没有,你可以通过包管理器安装它。

步骤 2: 生成自签名证书
创建证书密钥:

openssl genrsa -out rootCA.key 4096


创建根证书(CA),内容随便填:

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem


创建服务器证书的密钥:

openssl genrsa -out elasticsearch.key 4096


创建证书签名请求(CSR),内容随便填:

openssl req -new -key elasticsearch.key -out elasticsearch.csr


创建配置文件以指定证书选项:
创建一个文件 v3.ext ,以包含需要的DNS和IP地址,注意ip地址一定要设置准确,不然后面无法使用,例如:

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = elasticsearch
IP.1 = 127.0.0.1 #注意,如果是docker安装的一定要设置这个ip为容器ip地址,不然无法使用,可以
IP.2 = 172.17.0.2
IP.3 = 172.17.0.3  
#设置多个ip....


使用自己的CA签署SSL证书,如果ip不对的时候修改上面的v3.ext,从新运行下面的命令,然后移动到certs目录下面:

openssl x509 -req -in elasticsearch.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out elasticsearch.crt -days 500 -sha256 -extfile v3.ext


步骤 3: 设置Docker容器
在设置Elasticsearch Docker容器时,需要将证书挂载到容器内部,并配置Elasticsearch以使用这些证书。

创建一个docker-compose.yml文件,如下所示:

networks:
    1panel-network:
        external: true
services:
    elasticsearch:
        container_name: ${CONTAINER_NAME}
        deploy:
            resources:
                limits:
                    cpus: ${CPUS}
                    memory: ${MEMORY_LIMIT}
        environment:
            - discovery.type=single-node
            - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
            - ${P_ES_JAVA_OPTS}
            - xpack.security.enabled=true
            - xpack.security.transport.ssl.enabled=true
            - xpack.security.transport.ssl.verification_mode=certificate
            - xpack.security.transport.ssl.key=certs/elasticsearch.key
            - xpack.security.transport.ssl.certificate=certs/elasticsearch.crt
            - xpack.security.transport.ssl.certificate_authorities=certs/rootCA.pem
            - xpack.security.http.ssl.enabled=true
            - xpack.security.http.ssl.key=certs/elasticsearch.key
            - xpack.security.http.ssl.certificate=certs/elasticsearch.crt
            - xpack.security.http.ssl.certificate_authorities=certs/rootCA.pem
        image: docker.elastic.co/elasticsearch/elasticsearch:8.13.0 #使用那个版本就修改那个版本
        labels:
            createdBy: Apps
        networks:
            - 1panel-network
        ports:
            - ${HOST_IP}:${PANEL_APP_PORT_HTTP}:9200
        restart: always
        ulimits:
            memlock:
                hard: -1
                soft: -1
            nofile:
                hard: 65536
                soft: 65536
        volumes:
            - ./data/data:/usr/share/elasticsearch/data
            - ./data/backup:/usr/share/elasticsearch/backup
            - ./data/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
            - ./data/conf/certs:/usr/share/elasticsearch/config/certs
version: "3"

本地没有目录的,先新建相应的本地目录和文件,我的elasticsearch.yml文件配置如下:

cluster.name: "docker-cluster"
network.host: 0.0.0.0
path.repo: ["/usr/share/elasticsearch/backup"]
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: X-Requested-With,Content-Type,Content-Length,Authorization


将证书和密钥放在你的项目目录中的 certs 文件夹中。

步骤 4: 启动Elasticsearch
使用 docker-compose up 命令启动Elasticsearch容器。

步骤 5: 验证并设置密码

docker ps 可以查看所有docker的信息,找到你刚刚新建的容器名修改下面的命令,进入容器

docker container exec -it <容器名> bash

#进入后运行

./bin/elasticsearch-setup-passwords auto

如果一切正常就显示如下图,如果报ip错误,则按照步骤2中的v3.ext ip设置重新设置运行后面的命令:

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要连接开启了SSLElasticsearch集群,需要使用Java的TransportClient,并使用SSLContext来设置SSL连接。以下是一个简单的示例代码: ```java import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.transport.client.PreBuiltTransportClient; import javax.net.ssl.SSLContext; import java.net.InetAddress; import java.security.KeyStore; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class ESClient { public static void main(String[] args) throws Exception { Settings settings = Settings.builder() .put("cluster.name", "myClusterName") .put("xpack.security.user", "myUsername:myPassword") .put("xpack.security.transport.ssl.enabled", true) .put("xpack.security.transport.ssl.verification_mode", "certificate") .put("xpack.security.transport.ssl.keystore.path", "/path/to/keystore.jks") .put("xpack.security.transport.ssl.truststore.path", "/path/to/truststore.jks") .build(); SSLContext sslContext = SSLContext.getInstance("TLS"); KeyStore keyStore = KeyStore.getInstance("jks"); KeyStore trustStore = KeyStore.getInstance("jks"); keyStore.load(ESClient.class.getResourceAsStream("/path/to/keystore.jks"), "keystore_password".toCharArray()); trustStore.load(ESClient.class.getResourceAsStream("/path/to/truststore.jks"), "truststore_password".toCharArray()); TrustManager[] trustManagers = new TrustManager[] { new X509TrustManager() { public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {} public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {} public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }}; sslContext.init(null, trustManagers, new SecureRandom()); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300)) .setSSLContext(sslContext); XContentBuilder builder = XContentFactory.jsonBuilder(); builder.startObject().field("name", "John").endObject(); client.prepareIndex("myindex", "mytype", "1") .setSource(builder) .get(); client.close(); } } ``` 在这个示例代码中,我们首先使用Elasticsearch的TransportClient创建了一个连接,然后设置了连接ES集群所需的一些参数。其中,`xpack.security.user`参数是用于认证的用户名和密码,`xpack.security.transport.ssl.enabled`参数设置为`true`表示开启SSL连接,`xpack.security.transport.ssl.verification_mode`参数设置为`certificate`表示只信任CA署的证书。最后,我们设置了keystore和truststore的路径,并使用SSLContext将其加载。 接下来,我们使用TransportClient发送了一个简单的索引请求,将一个JSON文档插入到名为`myindex`、类型为`mytype`、ID为`1`的索引中。 注意,这只是一个简单的示例,实际应用中还需要根据实际情况进行配置和调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值