Django连接PlanetScale数据库报SSL无有效证书错误如何解决
问题原因
这个SSL连接报错的核心原因是Python的MySQL客户端在建立加密连接时,无法读取配置中指定的CA根证书,常见触发场景包括:
- 环境变量
MYSQL_ATTR_SSL_CA配置的证书路径不存在,多数情况是直接复制了PlanetScale的配置模板,但没有提前把对应CA证书下载到本地,或者填写的相对/绝对路径有误 - Windows环境下路径转义错误:路径中的反斜杠没有做转义处理,导致程序无法识别正确的文件位置
- mysqlclient驱动版本兼容问题:部分旧版本mysqlclient在Windows平台下处理SSL证书参数存在已知缺陷,无法正确加载CA文件
- 下载的CA证书文件本身损坏,内容不完整导致校验失败
修复方案
按以下步骤逐一排查修复即可:
- 确认CA证书路径有效
首先确保MYSQL_ATTR_SSL_CA指向的证书文件真实存在:- macOS/Linux环境可以直接使用系统自带的根证书库,不需要单独下载PlanetScale证书:
- macOS默认证书路径:
/etc/ssl/cert.pem - Debian/Ubuntu默认证书路径:
/etc/ssl/certs/ca-certificates.crt - RHEL/CentOS默认证书路径:
/etc/pki/tls/certs/ca-bundle.crt
- macOS默认证书路径:
- Windows环境需要手动下载PlanetScale根证书,存放到项目固定目录(比如项目根目录下的
certs文件夹),填写路径时使用正斜杠或者双反斜杠避免转义错误,例如C:/project/myapp/certs/ca.pem
- macOS/Linux环境可以直接使用系统自带的根证书库,不需要单独下载PlanetScale证书:
- 调整数据库配置
参考以下配置补充ssl_mode参数,强制走SSL连接:
如果是Windows环境仍报错,先执行DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': env('DB_NAME'), 'HOST': env('DB_HOST'), 'PORT': env('DB_PORT'), 'USER': env('DB_USER'), 'PASSWORD': env('DB_PASSWORD'), 'OPTIONS': { 'ssl': {'ca': env('MYSQL_ATTR_SSL_CA')}, 'ssl_mode': 'REQUIRED' } } }pip install --upgrade mysqlclient把驱动升级到最新稳定版,修复旧版本的SSL兼容问题。 - 校验环境变量配置
检查项目.env文件中MYSQL_ATTR_SSL_CA的取值,不要带多余的引号、空格,避免读取到错误的路径字符串。可以在Django shell中执行以下代码验证路径是否可访问:
执行后输出from pathlib import Path import os print(Path(os.getenv('MYSQL_ATTR_SSL_CA')).exists())True才代表路径配置正确,调整完成后重启Django服务即可正常连接。
内容的提问来源于stack exchange,提问作者Matthew Cole
相关产品推荐
相关产品推荐

