Kibana 9.0.1与Elasticsearch建立HTTPS连接失败求助
解决Kibana 9.0.1与Elasticsearch HTTPS连接失败问题
问题概述
纯内网环境使用官方Docker镜像部署Kibana/Elasticsearch 9.0.1,二者无法建立HTTPS连接:
- 宿主机执行curl命令可正常连接Elasticsearch:
# curl -u elastic:$ELASTIC_PASSWORD https://localhost:9200 --cacert /data/elastic-certs/kibana/elasticsearch-ca.pem { "name" : "01", "cluster_name" : "es-docker-cluster", "cluster_uuid" : "sKsPHeeNQ3680WxpOm0YVg", "version" : { "number" : "9.0.1", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "73f7594ea00db50aa7e941e151a5b3985f01e364", "build_date" : "2025-04-30T10:07:41.393025990Z", "build_snapshot" : false, "lucene_version" : "10.1.0", "minimum_wire_compatibility_version" : "8.18.0", "minimum_index_compatibility_version" : "8.0.0" }, "tagline" : "You Know, for Search" } - Kibana启动失败,报错:
Unable to retrieve version information from Elasticsearch nodes. Invalid character in header content ["authorization"] - Kibana容器内curl连接Elasticsearch失败:
[root@737d4a6496bb kibana]# curl https://elastic-server:9200 --cacert /usr/share/kibana/config/elasticsearch-ca.pem curl: (60) SSL: no alternative certificate subject name matches target host name 'elastic-server' - 证书问题:使用elasticsearch-certutil生成CA时已指定SAN,但证书实际无SAN,该问题从7.x.y版本升级至9.0.1后出现。
关键报错分析
- 证书SAN不匹配:Elasticsearch证书未包含容器域名
elastic-server的SAN记录,导致Kibana容器内curl时SSL验证失败。 - Authorization头非法字符:服务账号Token可能包含特殊字符,或shell解析时引入了多余字符,导致Kibana请求ES时Authorization头无效。
分步解决建议
1. 重新生成包含正确SAN的Elasticsearch证书
- 用
elasticsearch-certutil重新生成证书,明确指定包含容器域名elastic-server的SAN(可同时添加IP或其他需要的主机名):docker run --rm -v /data/elastic-certs:/certificates elasticsearch:9.0.1 \ bin/elasticsearch-certutil cert --ca /certificates/elasticsearch-ca.pem \ --ca-key /certificates/elasticsearch-ca.key \ --name elastic-server \ --dns elastic-server \ --ip 127.0.0.1,<ES容器实际IP> \ --out /certificates/elastic-server-cert.pem \ --key /certificates/elastic-server-key.pem - 更新Elasticsearch容器的证书挂载配置,使用新生成的证书重启ES服务。
2. 修复Kibana服务账号Token的环境变量配置
- 先手动验证Token提取结果,确保无多余换行或特殊字符:
cat /data/elastic-password/ElasticToken | awk -F '= ' '{print $2}' - 修改Kibana启动命令中
ELASTICSEARCH_SERVICEACCOUNTTOKEN的定义,用双引号包裹取值,避免shell解析时引入非法字符:--env ELASTICSEARCH_SERVICEACCOUNTTOKEN="$(cat /data/elastic-password/ElasticToken | awk -F '= ' '{print $2}')"
3. 调试验证(可选)
- 在Kibana容器内手动测试Token有效性,确认是否能正常访问ES:
curl https://elastic-server:9200 --cacert /usr/share/kibana/config/elasticsearch-ca.pem \ -H "Authorization: Bearer <提取到的服务账号Token>" - 若仍有SSL验证问题,可临时设置
ELASTICSEARCH_SSL_VERIFICATIONMODE="none"(生产环境不建议长期使用,仅用于调试),确认是否是证书问题导致的连接失败。
4. 检查Docker网络配置
- 确认Elasticsearch容器名称为
elastic-server,且与Kibana容器处于同一个elastic-net网络,容器间可通过域名正常解析。
内容的提问来源于stack exchange,提问作者dreezt
相关产品推荐
相关产品推荐

