报错内容:Transport SSL must be enabled if security is enabled on a [ basic ] license . Please set [ xpack . security . transport.ssl.cn abled ] to [ true ] or disable security by setting [ xpack . security . enabled ] to [ false ]

翻译过来就是:“如果在 Basic 许可证级别上启用了安全功能,则必须启用传输层 SSL。请将 xpack.security.transport.ssl.enabled 设置为 true,或者通过将 xpack.security.enabled 设置为 false 来禁用安全功能。”
简单来说,Elasticsearch 有两个主要的通信层面:
HTTP 层 (端口 9200): 用于客户端(比如 Kibana、你的应用程序)与 Elasticsearch 之间的通信。
传输层 (Transport Layer, 默认端口 9300): 用于 Elasticsearch 集群内部节点之间的通信,例如数据同步、主节点选举等。
通过 xpack.security.enabled=true 开启了安全功能(如用户名密码认证),但是没有为节点间的内部通信(传输层)配置 SSL/TLS 加密。从 Elasticsearch 7.x 的某个版本开始,当使用免费的 Basic 许可证时,如果开启了安全功能,出于安全考虑,官方强制要求节点间的通信也必须加密。

解决方案:

方案一:

(最简单的就是把xpack.security.enabled=true设置为false)

方案二:


为传输层启用 SSL/TLS

# 创建证书目录
mkdir -p /home/es/certs
sudo chown 1000:1000 /home/es/certs

# 生成证书,用于es集群间通信(注意我使用的是我本地镜像离线生成的证书,你需要把你的情况和我的解决方式发给AI,让AI帮你生成证书命令)
docker run \
  --rm \
  -v "/home/es/certs:/certs" \
  -u "1000:1000" \
  elasticsearch-ik:7.17.27 \
  /bin/bash -c "elasticsearch-certutil ca --out /certs/elastic-stack-ca.p12 --pass '' --days 36525 && \
               elasticsearch-certutil cert --ca /certs/elastic-stack-ca.p12 --ca-pass '' --out /certs/elastic-certificates.p12 --pass '' --days 36525"
注意:本证书有效期100年,仅供学习和测试使用

# 证书创建成功会有两个文件在目录:/home/es/certs/
elastic-certificates.p12 elastic-stack-ca.p12

docker-compose.yml中增加目录映射配置:
# --- 新增的 SSL 配置 ---

- xpack.security.transport.ssl.enabled=true

- xpack.security.transport.ssl.verification_mode=certificate

- xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12

- xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12

# ----------------------

完整如下:(注意es镜像为我自己打包的内含ik分词器的镜像)
 

version: '3.8'
services:
  elasticsearch1:
    image: elasticsearch-ik:7.17.27
    container_name: es-node1
    environment:
      - cluster.name=auth-cluster
      - node.name=node-1
      - discovery.seed_hosts=es-node1,es-node2
      - cluster.initial_master_nodes=node-1,node-2
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
      - xpack.security.enabled=true
      - ELASTIC_PASSWORD=123456
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12
      - xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12
      - ingest.geoip.downloader.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - /home/es/node1/data:/usr/share/elasticsearch/data
      - /home/es/certs:/usr/share/elasticsearch/config/certs
    ports:
      - 9200:9200
    networks:
      - es-net

  elasticsearch2:
    image: elasticsearch-ik:7.17.27
    container_name: es-node2
    environment:
      - cluster.name=auth-cluster
      - node.name=node-2
      - discovery.seed_hosts=es-node1,es-node2
      - cluster.initial_master_nodes=node-1,node-2
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
      - xpack.security.enabled=true
      - ELASTIC_PASSWORD=123456
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12
      - xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12
      - ingest.geoip.downloader.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - /home/es/node2/data:/usr/share/elasticsearch/data
      - /home/es/certs:/usr/share/elasticsearch/config/certs
    ports:
      - 9201:9200
    networks:
      - es-net
    depends_on:
      - elasticsearch1

  kibana:
    image: kibana:7.17.27
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://es-node1:9200
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=123456
      - ELASTICSEARCH_SSL_VERIFICATIONMODE=none
    ports:
      - 5601:5601
    networks:
      - es-net
    depends_on:
      - elasticsearch1

networks:
  es-net:
    driver: bridge

# 判断elasticsearch能正常使用:
# 执行命令curl -u elastic:123456 http://localhost:9200
# 最后一行输出: "You Know, for Search",代表安装成功
root@dfserver:/home/es/certs# curl -u elastic:123456 http://localhost:9200
{
  "name" : "node-1",
  "cluster_name" : "auth-cluster",
  "cluster_uuid" : "lFwiA7KURJyjdjvnYPzgUg",
  "version" : {
    "number" : "7.17.27",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "0f88dde84795b30ca0d2c0c4796643ec5938aeb5",
    "build_date" : "2025-01-09T14:09:01.578835424Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.3",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

#查看elasticsearch证书有效期:
docker exec -it es-node1 /usr/share/elasticsearch/jdk/bin/keytool -list -v -keystore /usr/share/elasticsearch/config/certs/elastic-certificates.p12 -storetype PKCS12 -storepass ""

结果:Valid from:这一行后面就是到期时间

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐