首页 > 解决方案 > Django MySQL 连接中的 SSL 错误(2026 SSL_CTX_set_tmp_dh 失败)

问题描述

尝试通过 settings.py 文件中的数据库 dict 连接到 RDS MySQL 实例会产生 django.db.utils.OperationalError: (2026, 'SSL connection error: SSL_CTX_set_tmp_dh failed')。

错误代码类似于django.db.utils.OperationalError: (2026, 'SSL connection error: SSL_CTX_set_tmp_dh failed'),所以我尝试使用 bin/mysql_ssl_rsa_setup 创建默认的 SSL 和 RSA 文件。

设置(从 Django 连接到 RDS MySQL 时类似于SSL 连接错误

通过 cli 连接有效,通过 PyMySql 在解释器中连接也是如此。

成功的 PyMySql 连接和查询如下所示:

db = pymysql.connect(user=os.environ['DEV_DATABASE_USERNAME'],
                         password=os.environ['DEV_MYSQL_PASSWORD'],
                         host=os.environ['DEV_DATABASE_HOST'],
                         cursorclass=pymysql.cursors.DictCursor, 
                         database='dev'),
                         ssl={'ssl':{'ca':<PATH TO CA CERT>}})

我已经尝试验证 ca 的路径是绝对的,它是,并确保我没有使用 python 来尝试构建它,就像从 Django 连接到 RDS MySQL 时出现 SSL 连接错误一样。

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'dev',
    'USER': os.environ['DEV_DATABASE_USERNAME'],
    'HOST': os.environ['DEV_DATABASE_HOST'],
    'PASSWORD': os.environ['DEV_MYSQL_PASSWORD'],
    'OPTIONS':  {
        'ssl': { 'ca': <PATH TO CA CERT> },
    }
}

}

标签: mysqldjangords

解决方案


我通过使用完全相同的 settings.py 文件创建一个全新的 Django 项目并更新 requirements.txt 中的所有包来解决这个问题,因此问题可能是 mysqlclient、PyMySQL 和 MySQL 5.6 之间的一些不兼容。


推荐阅读