pymongo [SSL: CERTIFICATE_VERIFY_FAILED]:证书已过期



我在我的Django应用程序中使用MongoDB(Mongo Atlas)。直到昨天一切都很好。但是今天,当我运行服务器时,它在控制台

上显示了以下错误
Exception in thread django-main-thread:
Traceback (most recent call last):
File "c:usersadminappdatalocalprogramspythonpython39libthreading.py", line 973, in _bootstrap_inner
self.run()
File "c:usersadminappdatalocalprogramspythonpython39libthreading.py", line 910, in run
self._target(*self._args, **self._kwargs)
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagesdjangoutilsautoreload.py", line 64, in wrapper
fn(*args, **kwargs)
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagesdjangocoremanagementcommandsrunserver.py", line 121, in inner_run
self.check_migrations()
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagesdjangocoremanagementbase.py", line 486, in check_migrations
executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagesdjangodbmigrationsexecutor.py", line 18, in __init__
self.loader = MigrationLoader(self.connection)
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagesdjangodbmigrationsloader.py", line 53, in __init__
self.build_graph()
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagesdjangodbmigrationsloader.py", line 220, in build_graph
self.applied_migrations = recorder.applied_migrations()
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagesdjangodbmigrationsrecorder.py", line 77, in applied_migrations
if self.has_table():
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagesdjangodbmigrationsrecorder.py", line 56, in has_table
tables = self.connection.introspection.table_names(cursor)
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagesdjangodbbackendsbaseintrospection.py", line 52, in table_names
return get_names(cursor)
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagesdjangodbbackendsbaseintrospection.py", line 47, in get_names
return sorted(ti.name for ti in self.get_table_list(cursor)
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagesdjongointrospection.py", line 47, in get_table_list
for c in cursor.db_conn.list_collection_names()
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagespymongodatabase.py", line 880, in list_collection_names
for result in self.list_collections(session=session, **kwargs)]
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagespymongodatabase.py", line 842, in list_collections
return self.__client._retryable_read(
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagespymongomongo_client.py", line 1514, in _retryable_read
server = self._select_server(
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagespymongomongo_client.py", line 1346, in _select_server
server = topology.select_server(server_selector)
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagespymongotopology.py", line 244, in select_server
return random.choice(self.select_servers(selector,
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagespymongotopology.py", line 202, in select_servers
server_descriptions = self._select_servers_loop(
File "C:UsersAdminAppDataLocalProgramsPythonPython39Libsite-packagespymongotopology.py", line 218, in _select_servers_loop
raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: cluster0-shard-00-02.mny7y.mongodb.net:27017: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129),cluster0-shard-00-01.mny7y.mongodb.net:27017: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129),cluster0-shard-00-00.mny7y.mongodb.net:27017: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129), Timeout: 30s, Topology Description: <TopologyDescription id: 6155f0c9148b07ff5851a1b3, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('cluster0-shard-00-00.mny7y.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('cluster0-shard-00-00.mny7y.mongodb.net:27017: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129)')>, <ServerDescription ('cluster0-shard-00-01.mny7y.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('cluster0-shard-00-01.mny7y.mongodb.net:27017: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129)')>, <ServerDescription ('cluster0-shard-00-02.mny7y.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('cluster0-shard-00-02.mny7y.mongodb.net:27017: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129)')>]>

我正在使用djjongo作为数据库引擎

DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'DbName',
'ENFORCE_SCHEMA': False,
'CLIENT': {
'host': 'mongodb+srv://username:password@cluster0.mny7y.mongodb.net/DbName?retryWrites=true&w=majority'
}  
}
}

和下列依赖项在应用

中被使用
dj-database-url==0.5.0
Django==3.2.5
djangorestframework==3.12.4
django-cors-headers==3.7.0
gunicorn==20.1.0
psycopg2==2.9.1
pytz==2021.1
whitenoise==5.3.0
djongo==1.3.6
dnspython==2.1.0

应该做什么来解决这个错误?

这是因为Let's Encrypt使用的根CA(和Mongo Atals使用的Let's Encrypt)已于2020-09-30过期-即"IdentTrust DST根CA x3";一。

修复方法是手动在Windows证书存储中安装"ISRG Root X1"one_answers"ISRG根X2"根证书,以及"让我们加密r3";中级一链接到他们的官方网站- https://letsencrypt.org/certificates/

从注释中复制:从第一个类别下载。der字段,下载,双击并按照向导安装。

我在我的windows电脑上解决了这个问题。它与Let 's Encrypt的DST根CA X3证书过期有关。

  1. 下载https://letsencrypt.org/certs/lets-encrypt-r3.pem
  2. 重命名文件。pem为。cer
  3. 双击并安装
  4. 重启电脑

仍然,如果它不起作用

  1. 进入https://letsencrypt.org/certificates/
  2. 下载ISRG Root X1, ISRG Root X2(根证书),Let 's Encrypt R3(中间证书)
  3. 重启电脑

我在mongoDB社区找到了解决方案。下载https://letsencrypt.org/certs/lets-encrypt-r3.pem

  1. .pem文件重命名为.cer
  2. 双击并安装
  3. 尝试运行应用程序

您的SSL问题应该得到解决。

来源:https://www.mongodb.com/community/forums/t/keep-getting-serverselectiontimeouterror/126190/13

MongoDB社区的另一个解决方案。超级简单,对我很有效。你可以在这里阅读完整的解决方案-

https://www.mongodb.com/community/forums/t/keep-getting-serverselectiontimeouterror/126190/

这是我的工作(Windows 11) -

检查dnspython, pymongo和certifi是否安装在虚拟环境中,或者通过以下方式安装它们:

pip install dnspython pymongo certifi

你能使用终端/命令行和运行Python, Python环境中你能输入和=运行以下命令(请更改密码作为适合您的用户在你的阿特拉斯集群):

from pymongo import MongoClient
import certifi
s = MongoClient("mongodb+srv://m220student:m220password@cluster0.maiqr.mongodb.net", tlsCAFile=certifi.where())

最新更新