ElasticSearch三节点集群SSL(curl)连接错误排查求助
Elasticsearch集群主节点SSL握手失败排查方案
问题背景
通过docker-compose搭建3节点ElasticSearch集群后,主节点es11执行curl -X GET 'https://localhost:9316'时报错curl: (35) Encountered end of file,浏览器访问该地址也失败,但相同命令在es12、es13节点可正常执行。
日志显示握手失败错误:
"stacktrace": ["org.elasticsearch.transport.RemoteTransportException: [es13][SOMEIP:9316][internal:cluster/coordination/join]", "Caused by: org.elasticsearch.transport.ConnectTransportException: [es11][SOMEIP:9316] handshake failed. unexpected remote node {es13}{SOMEVALUE}{SOMEVALUE "at org.elasticsearch.transport.TransportService.lambda$connectionValidator$6(TransportService.java:468) ~[elasticsearch-7.17.6.jar:7.17.6]", "at org.elasticsearch.action.ActionListener$MappedActionListener.onResponse(ActionListener.java:95) ~[elasticsearch-7.17.6.jar:7.17.6]", "at org.elasticsearch.transport.TransportService.lambda$handshake$9(TransportService.java:577) ~[elasticsearch-7.17.6.jar:7.17.6]",
相关配置信息
elasticsearch.yml配置
cluster.name: "docker-cluster" network.host: 0.0.0.0
所有节点docker-compose.yml端口配置
environment: - node.name=es11 - transport.port=9316 ports: - 9216:9200 - 9316:9316
集群搭建执行步骤
- 在ES11执行
docker swarm init,将es12、es13加入swarm集群 - 创建overlay网络:
docker network create -d overlay --attachable elastic - 按需停止集群并删除卷:
docker-compose down -v - 创建SSL证书:
docker-compose -f create-certs.yml run --rm create_certs - 复制证书到es12、es13服务器
- 在es12、es13用busybox创建overlay网络:
sudo docker run -itd --name containerX --net [network name] busybox - 在es12、es13配置证书:
docker-compose -f config-certs.yml run --rm config_certs - 各服务器执行
docker-compose up -d启动集群 - 配置内置账户密码:进入es11容器
docker exec -it es11 sh,运行bin/elasticsearch-setup-passwords interactive --url localhost:9316
SSL证书问题排查思路
1. 检查证书文件完整性与权限
- 进入es11容器,查看证书目录(通常为
/usr/share/elasticsearch/config/certs)下的文件,对比es12/es13的证书文件,确认文件名、文件大小完全一致,无缺失或损坏 - 执行
ls -l /usr/share/elasticsearch/config/certs检查权限,确保Elasticsearch默认用户elasticsearch对证书文件拥有读权限
2. 验证证书有效性
- 在es11容器内用openssl工具验证证书格式与内容:
重点检查证书有效期、CN名称是否匹配节点配置,确认无格式错误openssl x509 -in /usr/share/elasticsearch/config/certs/elasticsearch.crt -text -noout
3. 核对SSL相关配置参数
- 检查es11的
elasticsearch.yml是否完整配置SSL参数(当前提供的配置未包含,需补充检查),示例正确配置如下:
确保配置中的文件路径、文件名与实际证书完全一致,避免拼写错误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/ca.crt
4. 检查端口与网络连通性
- 宿主机执行
netstat -tulpn | grep 9316,确认9316端口被Elasticsearch进程正常占用 - 容器内执行
ss -tulpn | grep 9316,确认容器内部端口监听正常 - 在es11容器内ping es12/es13的容器名称,验证swarm overlay网络连通性
5. 提取完整日志细节
- 获取es11节点的完整Elasticsearch日志,查找SSL握手失败的具体原因(如CA证书不匹配、证书信任链缺失等)
重新生成证书的注意事项
重新执行步骤4创建SSL证书后,必须再次将新证书复制到es12、es13服务器,并重新执行步骤7的证书配置操作。因为Elasticsearch节点间通信依赖同一CA签发的证书,新生成的证书(含CA证书)与旧证书不一致时,其他节点会因无法验证证书导致握手失败。
内容的提问来源于stack exchange,提问作者Boodle
相关产品推荐
相关产品推荐

