Django迁移至SSL加密MySQL后无法连接,SSL配置不生效排查
核心问题定位
你当前的配置最明显的错误是OPTIONS配置层级错误:OPTIONS必须放在对应数据库(此处为default)的配置字典内部,你现在把OPTIONS和default平级放置,Django完全读取不到SSL相关配置,自然不会生效。
正确的配置示例如下:
DATABASES = { "default": { "ENGINE": 'django.db.backends.mysql', "NAME": env("DATABASE_NAME"), "USER": env("DATABASE_USER"), "PASSWORD": env("DATABASE_PASSWORD"), "HOST": env("DATABASE_HOST"), "PORT": env.int("DATABASE_PORT"), "CONN_MAX_AGE": env.int("DATABASE_CONN_MAX_AGE", default=0), # OPTIONS必须放在default对应的字典内部 "OPTIONS": { # 注意MySQL驱动的连接超时参数为connect_timeout,不是timeout "connect_timeout": env.int("DATABASE_CONN_TIMEOUT", default=60), "ssl": { "ca": CA_ROOT_PATH } } } }
后续排查方向
- 配置修正后再次执行
python3 manage.py dbshell,查看输出的mysql命令是否已经携带了--ssl-ca相关参数,确认配置被正常读取 - 手动构造带SSL参数的mysql命令测试连通性,排除证书、数据库侧配置问题:
如果手动执行也报错,优先排查:mysql --user=${DATABASE_USER} --password=${DATABASE_PASSWORD} --host=${DATABASE_HOST} --port=${DATABASE_PORT} --ssl-ca=${CA_ROOT_PATH} ${DATABASE_NAME}- CA证书文件是否真实存在,运行Django的进程是否有该文件的读取权限
- 数据库端是否强制开启SSL,是否配置了正确的CA证书,是否允许当前客户端IP通过SSL连接
- 确认依赖版本匹配:
- 若使用pymysql作为驱动,需确保版本≥0.10.0,且已正确配置
pymysql.install_as_MySQLdb() - 若使用mysqlclient作为驱动,需确保版本≥2.0.3
- Django版本建议≥3.2,低版本对MySQL SSL配置的处理存在已知问题
- 若使用pymysql作为驱动,需确保版本≥0.10.0,且已正确配置
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

