MySQL从5.7升级至8.0后Django应用报2026 SSL连接错误如何解决?
报错信息
django.db.utils.OperationalError: (2026, 'SSL connection error: unknown error number')
问题根因
MySQL 8.0相对5.7版本调整了SSL连接的默认安全策略,核心变化是默认开启SSL证书主机名验证(VERIFY_IDENTITY模式),要求连接时使用的主机名/IP和服务器证书的通用名(CN)或使用者备用名称(SAN)一致,而5.7版本默认只验证CA证书有效性不校验主机名,这是绝大多数升级后出现SSL连接错误的原因。此外MySQL 8.0默认禁用了TLS 1.0、TLS 1.1等老旧协议,若客户端依赖的加密库版本过低也会触发连接失败。
解决方案
方案1:调整Django数据库SSL配置(快速修复,适合测试环境)
在Django的settings.py的DATABASES配置项中,显式指定SSL验证模式跳过主机名校验即可,不同驱动的配置写法如下:
- 若使用
mysqlclient作为数据库驱动:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '你的库名', 'USER': '用户名', 'PASSWORD': '密码', 'HOST': '数据库地址', 'PORT': '3306', 'OPTIONS': { 'ssl_mode': 'VERIFY_CA', # 仅验证CA证书,不校验主机名 'ssl': { 'ca': '/path/to/你的ca.pem' } } } }
- 若使用
pymysql作为数据库驱动:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '你的库名', 'USER': '用户名', 'PASSWORD': '密码', 'HOST': '数据库地址', 'PORT': '3306', 'OPTIONS': { 'ssl': { 'ca': '/path/to/你的ca.pem', 'check_hostname': False # 关闭主机名校验 } } } }
方案2:更新服务器证书(生产环境推荐,安全性更高)
重新生成MySQL的服务端证书,将你连接数据库时使用的所有主机名、IP地址都加到证书的使用者备用名称(SAN)字段中,无需修改Django配置即可适配MySQL 8.0的默认安全策略。
方案3:升级依赖驱动版本
如果调整配置后仍报错,将对应数据库驱动升级到兼容MySQL 8.0的版本:
- mysqlclient ≥ 2.0.3
- pymysql ≥ 1.0.2
验证方法
可以先通过MySQL命令行工具验证连接是否正常,排除服务端问题:
mysql -u 用户名 -p -h 数据库地址 --ssl-ca=/path/to/ca.pem --ssl-mode=VERIFY_CA
若可以正常登录则说明服务端SSL配置无问题,只需调整Django配置即可。
内容的提问来源于stack exchange,提问作者wonton
相关产品推荐
相关产品推荐

