首页 > 解决方案 > 使用 TLS 将 pymongo 客户端连接到 mongodb 服务器

问题描述

我在 Google Cloud 上有 2 个实例:

实例 A实例 B - 都具有静态外部 IP 地址。

实例 A运行 MongoDB 服务器 v4.4.6 的社区版。

因此,我成功地使用实例 B 中的 mongo shell(v4.4.6)连接到在实例 A上运行的 mongo 服务器。这是我使用的命令 -

mongo --tls --tlsCertificateKeyFile client.pem --tlsCAFile ca.pem <instance_a_ip>:<port>/admin -u <userName> -p

我想使用实例 B中的 pymongo(v3.11.4) 客户端来连接到实例 A中的 MongoDB 服务器,我已经尝试在交互式 python shell 中使用它 -

client = MongoClient("mongodb://<instance_a_ip>:<port>/admin", tls=True, tlsCertificateKeyFile='./client.pem', tlsCAFile='./ca.pem', username='<userName>', password='<userPassword>')

但是,我无法连接,这是我收到的错误 -

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/varun/test-env/lib/python3.8/site-packages/pymongo/collection.py", line 1319, in find_one
    for result in cursor.limit(-1):
  File "/home/varun/test-env/lib/python3.8/site-packages/pymongo/cursor.py", line 1207, in next
    if len(self.__data) or self._refresh():
  File "/home/varun/test-env/lib/python3.8/site-packages/pymongo/cursor.py", line 1100, in _refresh
    self.__session = self.__collection.database.client._ensure_session()
  File "/home/varun/test-env/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1816, in _ensure_session
    return self.__start_session(True, causal_consistency=False)
  File "/home/varun/test-env/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1766, in __start_session
    server_session = self._get_server_session()
  File "/home/varun/test-env/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1802, in _get_server_session
    return self._topology.get_server_session()
  File "/home/varun/test-env/lib/python3.8/site-packages/pymongo/topology.py", line 496, in get_server_session
    self._select_servers_loop(
  File "/home/varun/test-env/lib/python3.8/site-packages/pymongo/topology.py", line 215, in _select_servers_loop
    raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: <instance_a_ip>:<port>: ("Invalid DNS pattern b'127.0.0.1'.",), Timeout: 30s, Topology Description: <TopologyDescription id: 60ad03827b267af40c2edf4b, topology_type: Single, servers: [<ServerDescription ('<instance_a_ip>', <port>) server_type: Unknown, rtt: None, error=AutoReconnect('<instance_a_ip>:<port>: ("Invalid DNS pattern b\'127.0.0.1\'.",)')>]>

我是 MongoDB 的新手,无法弄清楚如何去做,我们将不胜感激。

标签: python-3.xmongodbpymongopymongo-3.x

解决方案


您的证书是自签名的,在创建 MongoClient 时添加此选项。

tlsInsecure=True

代码将是这样的

client = MongoClient(
    ["<instance_a_ip>:<port>"], 
    tls=True, 
    tlsInsecure=True, 
    tlsCertificateKeyFile='./client.pem', 
    tlsCAFile='./ca.pem', 
    username='<userName>', 
    password='<userPassword>'
)

推荐阅读