python-3.x - 使用 TLS 将 pymongo 客户端连接到 mongodb 服务器
问题描述
我在 Google Cloud 上有 2 个实例:
实例 A和实例 B - 都具有静态外部 IP 地址。
实例 A运行 MongoDB 服务器 v4.4.6 的社区版。
- 我已生成自签名证书以启用 TLS
- 我已经在我的云网络中设置了防火墙规则,以允许从实例 B的 IP 地址到 MongoDB 端口的流量
因此,我成功地使用实例 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 的新手,无法弄清楚如何去做,我们将不胜感激。
解决方案
您的证书是自签名的,在创建 MongoClient 时添加此选项。
tlsInsecure=True
代码将是这样的
client = MongoClient(
["<instance_a_ip>:<port>"],
tls=True,
tlsInsecure=True,
tlsCertificateKeyFile='./client.pem',
tlsCAFile='./ca.pem',
username='<userName>',
password='<userPassword>'
)
推荐阅读
- javascript - 强制div具有均匀的宽度和高度?
- sql - 为我的表中的每个列名提取一个 NOT NULL 值
- java - 如何从具有不同值的类型类的 ArrayList 中获取特定值
- azure - OAuth 2.0 Azure Active Directory <> next-auth
- python - 如何使用熊猫将字符串中的值转换为列?
- java - 将 Thymeleaf 块内容作为变量传递给片段
- reactjs - 令牌刷新后是否需要再次调用 firebase.database.on()?
- c++ - 当我包含 boost 标头时,我有一个错误:信息:没有为 myTest 构建
- python - 将 netcdfs 转换为 zarr 并重新分块时 CPU 利用率低
- python - 将值分离到字典中并在 Python 中对它们进行计数