想用apisix做网关,先在测试环境开搞。

首先需要一套etcd,为了方便就用helm起了一套,顺便启用了tls,结果helm装apisix时遇到问题,etcd居然连不上,似乎证书认证支持有问题 ref1, ref2,只好先设置不检查证书(verify: false)。

接下来是apisix-dashboard,也连不上etcd,毕竟helm配置里都没有tls相关设置,但是软件本身是支持的,索性自己增加了tls配置,发现还是连不上,证书校验不过,想着也不检查证书吧,可惜软件还没支持,回头看下helm装的etcd是自动生成的自签证书,CN是固定的,只好用cfssl重新签了一套证书,把svc会用到的域名都写进去了,这下终于好了。

等到要上线的时候,想着就不自建etcd吧,腾讯云有提供etcd服务,直接买了,这下又坑了,默认的证书只有vip在SAN里,apisix还好可以不检查证书,但是dashboard又过不去了,这2个软件连etcd的行为不一样,前者只连vip,后者还会获取etcd节点信息然后全部都要连,只有vip在SAN里,那肯定通不过校验啊。

行吧,退掉重新买,这次记得填上了域名信息,以为用域名来连就万事大吉了。结果仍然是打脸了,vip连接没问题,各个节点连接居然还是一样的报错:

{"level":"warn","ts":"2023-07-26T10:55:32.904Z","logger":"etcd-client","caller":"[email protected]/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc00047ce00/10.0.1.95:2379","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = latest balancer error: last connection error: connection error: desc = \"transport: authentication handshake failed: x509: certificate is valid for 10.0.1.95, not 10.0.1.145""}

这啥玩意啊,明明用的域名为啥还要拿IP去验证?看来dashboard连etcd节点并没有用域名啊,手工list member 看下,确实节点广播的都是IP地址。。。可是节点的证书SAN里只有vip和域名,可咋整?

又不想自建etcd,购买的也不支持自定义证书,想来想去,得让dashboard连节点时带上域名信息应该就可以通过证书检查了。

Go语言我不会啊,赶紧咨询ChatGPT,立即就给出了带域名的方法,说干就干,一通魔改,重新编译后替换二进制文件,哈哈,成功了!

顺便想起来到社区搜了一下,也有人遇到这个问题,但是始终没有修复,既然耗费我这么多时间,那就顺手提一个PR吧,希望可以帮到有缘人。