徐中民 2026-02-07 13:50 采纳率: 98.5%
浏览 1
已采纳

ES 9.0中Kibana无法连接Elasticsearch集群怎么办?

**ES 9.0中Kibana无法连接Elasticsearch集群的常见原因:SSL/TLS配置不匹配** 在Elasticsearch 9.0默认启用安全特性(TLS加密、基于PKI的身份认证)后,Kibana若未正确配置`elasticsearch.hosts`、`elasticsearch.ssl.certificateAuthorities`或遗漏`elasticsearch.username`/`elasticsearch.password`(尤其当启用了`security.enabled: true`),将出现“Unable to retrieve version information”或“Connection refused”错误。典型表现为Kibana日志中反复报`RequestError: socket hang up`或`certificate has expired`。需重点验证:① CA证书路径是否指向ES生成的`http_ca.crt`;② Kibana用户(如`kibana_system`)是否已通过`bin/elasticsearch-users`工具创建并赋权;③ `elasticsearch.ssl.verificationMode`是否设为`full`(默认)且证书域名与`elasticsearch.hosts`一致。跳过证书校验(`verificationMode: none`)仅限开发环境,生产严禁使用。
  • 写回答

2条回答 默认 最新

  • 杨利杰YJlio 优质创作者: 操作系统技术领域 2026-02-07 15:52
    关注

    我是YJlio杨利杰让我来给你回答,以下回答来自ChatGpt5.2 Thinking 深度思考

    先说结论(ES 9.0 下最常见根因)

    ES 9.0 默认安全机制(HTTPS/TLS + 认证)开启时,Kibana 连不上集群,基本都落在三类:

    1. Kibana 还在用 http:// 或端口/地址写错
    2. TLS 校验失败(CA 不对 / 证书过期 / 域名或 IP 不在 SAN)
    3. 认证失败(kibana_system 密码不对、或错误使用 elastic 超级用户)。 (CSDN问答)

    1)3 条命令把问题快速“归类”

    A. 先确认 ES 的 HTTPS 本身可用(在 Kibana 机器上执行)

    curl -v https://<es_host>:9200
    
    • 如果直接 Connection refused / timeout:先排网络/端口/防火墙/ES 未监听(不是 Kibana 配置问题)。

    B. 用 CA 验证 ES 证书链是否正确(推荐)

    把 ES 生成/使用的 CA(常见为 http_ca.crt)拷到 Kibana 机器,然后:

    curl --cacert /path/http_ca.crt -u elastic https://<es_host>:9200
    
    • 这一步能判断:CA 是否正确、证书链是否可验证。(Elastic)

    C. 若报“hostname mismatch / no SAN”,基本就是证书 SAN 不匹配

    Elastic 官方排障点名:证书未包含正确的 SubjectAlternativeName(SAN)会导致握手失败。(Elastic)


    2)推荐做法:用 Enrollment Token 让 Kibana 自动写入安全配置(最省事)

    在 ES 节点创建 Kibana enrollment token(30 分钟有效),然后按 Kibana 启动提示输入:

    bin/elasticsearch-create-enrollment-token -s kibana
    

    该 token 会把必要的安全配置写入 kibana.yml,并让 Kibana 用内置服务账号方式完成对接。(Elastic)


    3)手工配置的“最小可行” kibana.yml(生产建议)

    elasticsearch.hosts: ["https://es-node-01.example.com:9200"]
    
    # 信任 ES HTTP 层的 CA(通常就是 http_ca.crt)
    elasticsearch.ssl.certificateAuthorities: ["/etc/kibana/certs/http_ca.crt"]
    
    # 认证方式二选一:建议用 serviceAccountToken;或用 kibana_system
    # 方式A:service account token(常用于自动/规范部署)
    # elasticsearch.serviceAccountToken: "<token>"
    
    # 方式B:kibana_system 用户(不要用 elastic)
    elasticsearch.username: "kibana_system"
    elasticsearch.password: "<password>"
    
    # 证书校验:生产建议 full(前提:证书 SAN 包含你写的主机名)
    elasticsearch.ssl.verificationMode: "full"
    

    要点:

    • **必须是 https://**,并且 CA 路径可读;(Elastic)
    • kibana_system 是给 Kibana 后端连 ES 用的内置用户(不是给人登录 Kibana UI 用的);(Elastic)
    • 不要在 Kibana 里配置 elastic 用户(官方与社区都明确不推荐/会触发限制或带来系统索引权限问题)。(Discuss the Elastic Stack)
    • 若用 elasticsearch.serviceAccountToken,不要再混用 elasticsearch.username/password(两种方式二选一)。(Discuss the Elastic Stack)

    4)常见报错 → 对应修复(按命中率)

    报错:Unable to retrieve version information / socket hang up

    多为 TLS 握手阶段失败(CA 不对、证书过期、SAN 不匹配)。优先按上面的 curl --cacert 验证链路,再修证书/SAN。(CSDN问答)

    报错:self signed certificate in certificate chain

    Kibana 没信任 ES 的 CA:把 ES 的 CA(例如 http_ca.crt)配置到 elasticsearch.ssl.certificateAuthorities。(Elastic)

    报错:certificate ... doesn't match any of the subject alternative names

    证书 SAN 不包含你在 elasticsearch.hosts 写的域名/IP。生产建议重签证书让 SAN 覆盖实际访问名;临时止血可把 verificationMode 调到 certificate(不校验主机名)或 none(开发环境才考虑)。(Elastic)

    报错:unable to authenticate user [kibana_system]

    重置/设置 kibana_system 密码,然后更新 kibana.yml

    bin/elasticsearch-reset-password -u kibana_system
    

    该工具用于重置内置用户密码(包括 kibana_system)。(Elastic)


    5)一句话排查顺序(照做基本能通)

    1. curl https://es:9200 先排网络/端口;
    2. curl --cacert http_ca.crt ... 排 CA/证书链;
    3. 若是 SAN 不匹配,先修证书再坚持 verificationMode: full;(Elastic)
    4. 用 enrollment token 自动配置,或手工配 CA + kibana_system/serviceAccountToken。(Elastic)
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 今天
  • 创建了问题 2月7日