📅  最后修改于: 2023-12-03 15:09:40.153000             🧑  作者: Mango
当使用 Python 连接到 MongoDB Atlas 数据库时,有时会出现 Asn1 解析错误。这可能是由于 SSL/TLS 握手期间出现问题造成的。本文将介绍如何解决此问题。
当使用以下代码尝试连接到 MongoDB Atlas 数据库时,会出现 Asn1 解析错误:
import pymongo
client = pymongo.MongoClient("mongodb+srv://<username>:<password>@<cluster-address>/test?retryWrites=true&w=majority")
db = client.test
错误信息如下:
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:1125)
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1125)
asn1 encoding routines:ASN1_get_object:header too long
要解决此问题,可以尝试以下步骤:
首先,尝试升级 Python 版本。这可能会固定该问题,因为某些版本的 Python 在解析 ASN.1 密钥交换期间有问题。
如果升级 Python 并未解决问题,则可以尝试更新 OpenSSL 版本。这通常可以通过升级操作系统或使用软件包管理器来完成。
如果使用 MongoDB Atlas 的连接字符串,则可以禁用 SSL/TLS 验证。为此,请在连接字符串中添加 ssl=false
参数,如下所示:
client = pymongo.MongoClient("mongodb+srv://<username>:<password>@<cluster-address>/test?retryWrites=true&w=majority&ssl=false")
如果以上步骤都未解决问题,则可以导入 CA 证书以验证连接。为此,请按照以下步骤操作:
在浏览器中打开 MongoDB Atlas 控制台,并导航到“Security”>“Network Access”>“IP Whitelist”。
单击“Add IP Address”并添加 IP 地址,以允许连接到 MongoDB Atlas。
导航到“Security”>“Database Access”>“Add New User”,并添加用户。
导航到“Security”>“MongoDB Users”,找到刚添加的用户,并单击“Edit”。
单击“Autogenerated Secure Password”生成密码,并将其复制到剪贴板中。
在代码中使用以下连接字符串:
client = pymongo.MongoClient(
"mongodb+srv://<username>:<password>@<cluster-address>/test?retryWrites=true&w=majority&ssl=true&ssl_ca_certs=/path/to/ca.crt"
)
替换 <username>
、<password>
和 <cluster-address>
,并将 /path/to/ca.crt
替换为 CA 证书文件的路径。
在命令行中导出 CA 证书:
openssl s_client -connect cluster0-shard-00-00-abcde.mongodb.net:27017 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM > /path/to/ca.crt
替换 cluster0-shard-00-00-abcde.mongodb.net:27017
为你的 MongoDB Atlas 集群地址,并将 /path/to/ca.crt
替换为要导出的 CA 证书文件的路径。
上述命令将从 MongoDB Atlas 集群获取 CA 证书,并将其导出为 PEM 格式。
将导出的 CA 证书文件传输到 Python 代码运行所在的服务器,并将 ssl_ca_certs
参数设置为导出的 CA 证书文件的路径。
现在应该可以成功连接到 MongoDB Atlas 数据库了。
当连接到 MongoDB Atlas 数据库时出现 Asn1 解析错误时,请尝试升级 Python 版本、更新 OpenSSL 版本、禁用 SSL/TLS 验证或导入 CA 证书。在这些步骤中,至少有一个步骤可以解决问题。