1

我正在尝试从我的 django 应用程序连接到 MongoDb,但它抛出

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)例外。

当我连接到 MongoDB 时,pymongo 抛出了同样的异常,但是我可以通过&ssl_cert_reqs=CERT_NONE在连接 uri 的末尾附加 , 来使连接正常工作。基本上,我试图连接的 MongoDb 已经实现了 ssl,我不想通过证书来获得连接。

但是,在 dango 中,它希望我们在 settings.py 文件的数据库配置部分中传递一个键值对字典。

我尝试'SSL':True,'SSL_CERT_REQS':'CERT_NONE'从我的应用程序中指定相同的连接设置,但它不断抛出相同的异常。

非常感谢任何帮助,如何配置证书或只是绕过客户端的证书检查以使连接正常工作。谢谢 !

4

1 回答 1

0

这是文件下 djongo 代码的限制:'<>\Lib\site-packages\djongo\base.py'

    def get_connection_params(self):
    """
    Default method to acquire database connection parameters.

    Sets connection parameters to match settings.py, and sets
    default values to blank fields.
    """
    valid_settings = {
        'NAME': 'name',
        'HOST': 'host',
        'PORT': 'port',
        'USER': 'username',
        'PASSWORD': 'password',
        'AUTH_SOURCE': 'authSource',
        'AUTH_MECHANISM': 'authMechanism',
        'ENFORCE_SCHEMA': 'enforce_schema',
        'REPLICASET': 'replicaset',
        'SSL': 'ssl',
        'SSL_CERTFILE': 'ssl_certfile',
        'SSL_CA_CERTS': 'ssl_ca_certs',
        'READ_PREFERENCE': 'read_preference'
    }
    connection_params = {
        'name': 'djongo_test',
        'enforce_schema': True
    }
    for setting_name, kwarg in valid_settings.items():
        try:
            setting = self.settings_dict[setting_name]
        except KeyError:
            continue

        if setting or setting is False:
            connection_params[kwarg] = setting

    return connection_params

在上面的代码中,valid_settings 字典应该还有一个键值对,即'SSL_CERT_REQS':'ssl_cert_reqs'。

此外,由于 ssl.CERT_NONE 为 0(IntEnum 中的第一个序数),所以我们需要再添加一个或条件 'setting == 0' 和 'setting or setting is False'

您可以手动添加此行,如果您在设置的 DATABASES 的默认字典中添加以下行,它应该可以工作:'SSL_CERT_REQS': ssl.CERT_NONE,

所以最终的更新方法如下:

def get_connection_params(self):
    """
    Default method to acquire database connection parameters.

    Sets connection parameters to match settings.py, and sets
    default values to blank fields.
    """
    valid_settings = {
        'NAME': 'name',
        'HOST': 'host',
        'PORT': 'port',
        'USER': 'username',
        'PASSWORD': 'password',
        'AUTH_SOURCE': 'authSource',
        'AUTH_MECHANISM': 'authMechanism',
        'ENFORCE_SCHEMA': 'enforce_schema',
        'REPLICASET': 'replicaset',
        'SSL': 'ssl',
        'SSL_CERTFILE': 'ssl_certfile',
        'SSL_CA_CERTS': 'ssl_ca_certs',
        'READ_PREFERENCE': 'read_preference',
        'SSL_CERT_REQS': 'ssl_cert_reqs'
    }
    connection_params = {
        'name': 'djongo_test',
        'enforce_schema': True
    }
    for setting_name, kwarg in valid_settings.items():
        try:
            setting = self.settings_dict[setting_name]
        except KeyError:
            continue

        if setting or setting is False or setting == 0:
            connection_params[kwarg] = setting

    return connection_params
于 2019-12-13T18:04:25.360 回答