0

我们的 mongo java 驱动程序和监控线程有问题。

我们正在运行 3 个服务器副本集,并使用主机名连接我们的 Spring Boot 微服务。 mongodb://<username>:<password>@A:27017,B:27017,C:27017/?tls=true

到目前为止,我们一直使用非反应式 mongo 驱动程序,一切正常。但是我现在想使用响应式/netty 版本,我们得到了一个java.security.cert.CertificateException,因为它试图通过 IP 而不是主机名来验证替代名称。

我通过库进行了调试,并且能够看到当 Replicaset 线程的监控线程启动时,它们正在接收{hello: 1}IP 而不是主机名。

  1. 监控线程通过主机名连接 --> 一切正常
  2. 随着监控线程的第一个状态请求,它们接收主机作为 IP
  3. Mongo 驱动程序使用 IP 地址更新监控集群的副本集并删除主机名
  4. 新的 IP 监控线程已启动并尝试 hello 命令
  5. 由于 IP 验证主机名,命令失败

似乎这适用于非反应性,因为 IP 被解析Inet4Address并因此再次获得正确的主机名。

有人对此有解决方案吗?除了

  • 添加 IP 作为证书的替代名称(IP 可能会更改)
  • 允许无效的主机名(sslInvalidHostNameAllowed 选项)

是否我们在服务器端配置了一些东西,所以 mongo 返回主机名而不是 IP?

提前谢谢你。

4

1 回答 1

0

显然,我们的副本集在我们的一个环境中配置错误。bindIp 被设置为 ip 地址而不是主机名(这可能没有区别),但副本集也被初始化为 ip 地址而不是主机名。

将所有成员主机的属性更新为主机名后,它按预期工作。

于 2022-03-01T15:54:53.927 回答