📌  相关文章
📜  尝试连接到 mongo atlas 时出现 Asn1 解析错误 - Python (1)

📅  最后修改于: 2023-12-03 15:09:40.153000             🧑  作者: Mango

尝试连接到 MongoDB Atlas 时出现 Asn1 解析错误 - Python

当使用 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
解决方案

要解决此问题,可以尝试以下步骤:

步骤 1:升级 Python 版本

首先,尝试升级 Python 版本。这可能会固定该问题,因为某些版本的 Python 在解析 ASN.1 密钥交换期间有问题。

步骤 2:更新 OpenSSL 版本

如果升级 Python 并未解决问题,则可以尝试更新 OpenSSL 版本。这通常可以通过升级操作系统或使用软件包管理器来完成。

步骤 3:禁用 SSL/TLS 验证

如果使用 MongoDB Atlas 的连接字符串,则可以禁用 SSL/TLS 验证。为此,请在连接字符串中添加 ssl=false 参数,如下所示:

client = pymongo.MongoClient("mongodb+srv://<username>:<password>@<cluster-address>/test?retryWrites=true&w=majority&ssl=false")
步骤 4:导入 CA 证书

如果以上步骤都未解决问题,则可以导入 CA 证书以验证连接。为此,请按照以下步骤操作:

  1. 在浏览器中打开 MongoDB Atlas 控制台,并导航到“Security”>“Network Access”>“IP Whitelist”。

  2. 单击“Add IP Address”并添加 IP 地址,以允许连接到 MongoDB Atlas。

  3. 导航到“Security”>“Database Access”>“Add New User”,并添加用户。

  4. 导航到“Security”>“MongoDB Users”,找到刚添加的用户,并单击“Edit”。

  5. 单击“Autogenerated Secure Password”生成密码,并将其复制到剪贴板中。

  6. 在代码中使用以下连接字符串:

    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 证书文件的路径。

  7. 在命令行中导出 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 格式。

  8. 将导出的 CA 证书文件传输到 Python 代码运行所在的服务器,并将 ssl_ca_certs 参数设置为导出的 CA 证书文件的路径。

现在应该可以成功连接到 MongoDB Atlas 数据库了。

结论

当连接到 MongoDB Atlas 数据库时出现 Asn1 解析错误时,请尝试升级 Python 版本、更新 OpenSSL 版本、禁用 SSL/TLS 验证或导入 CA 证书。在这些步骤中,至少有一个步骤可以解决问题。