昨天社区小伙伴问了一个问题:
说:在 Categraf 中采集 es-exporter 的数据,明明配置了 insecure_skip_verify = true 为什么还是报错:x509: cannot validate certificate for 10.0.x because it doesn't contain any IP SANs。
截图如下:
我对 Categraf 这个开源项目很熟悉,可以一眼知道问题,但是普通用户是不清楚的。授人以鱼不如授人以渔,普通用户应该如何让 AI 协助排查这类问题呢?
其实也很简单,你只需要把如下信息告诉 AI 即可:
- 开源项目的文档地址,如果有本地目录那最好了,如果没有,就把文档 URL 告诉 AI 也可以
- 开源项目的代码目录,clone 下来放到本机让 AI 分析
- 你的需求,比如在上例中就是想采集 ElasticSearch 的监控数据
- 你的配置,上例中有截图,那个截图就够用了
- 遇到的问题,比如报错消息,看到的现象。只描述现象即可,不要说你的推测,你的推测可能对 AI 是负向引导
于是,我就把上面的信息问了 AI:
文档和代码信息我之前已经写到 AI Agent 的 Knowledge 里了,所以这次没有重复给,我只是给了群友的截图和问题。把群友的问题原封不动发给了 AI,实际后来发现,群友的问题问的不准确,那根本不是采集 es-exporter 的数据,而是直连 es,无所谓了,AI 也做到了正确回复。
详细回复如下:
根因分析
问题出在 缺少 use_tls = true 配置。
两张图的信息对照
| 配置(图1) | 报错(图2) | |
|---|---|---|
| 内容 | servers = ["https://10.0.x:9200"] + insecure_skip_verify = true |
x509: cannot validate certificate for 10.0.x because it doesn't contain any IP SANs |
| 关键 | 只设了 insecure_skip_verify,没有 use_tls |
TLS 证书校验失败 |
为什么会这样?
Categraf 的 elasticsearch 插件源码逻辑(pkg/tls/config.go)是:
- 先检查
UseTLS(对应 toml 字段use_tls)是否为true - 只有
use_tls = true时 ,才会构建tls.Config并将InsecureSkipVerify传进去 - 如果
use_tls没有显式设为true,即使servers里写的是https://,TLS 配置不会生效 ,insecure_skip_verify = true被忽略
所以虽然你写了 insecure_skip_verify = true,但因为没开启 use_tls,插件没有应用这个跳过验证的设置,仍然走了标准证书验证------而你的 ES 证书里没有包含 IP 地址的 SAN(Subject Alternative Name),导致校验失败。
正确配置
toml
[[instances]]
servers = ["https://10.0.x.x:9200"]
username = "elastic"
password = "your-password"
## 关键:必须显式开启 TLS
use_tls = true
insecure_skip_verify = true
加上 use_tls = true 后重启 Categraf 即可解决。
⚠️ 补充说明:
insecure_skip_verify = true会跳过证书校验,适用于自签名证书或证书 SAN 不匹配的测试/内网环境。生产环境建议配置正确的证书或使用tls_ca指定 CA。
结语
这个时代,比拼的是把问题描述清楚的能力。兄弟们,共勉。