Django连接远程MariaDB时出现SSL格式错误求助
Django连接远程MariaDB的SSL错误排查与解决
问题场景
搭建Django环境时,使用如下数据库配置连接远程MariaDB:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'USER': 'xx', 'HOST': 'xx', 'PASSWORD': 'xx', 'NAME': 'xx', 'PORT': '', 'OPTIONS': {'ssl': True}, } }
出现错误:
django.db.utils.OperationalError: (2026, 'SSL connection error: The message received was unexpected or badly formatted')
环境信息
MariaDB服务器状态
MariaDB [(none)]> status -------------- C:\Program Files\MariaDB 11.2\bin\mysql.exe from 11.2.2-MariaDB, client 15.2 for Win64 (AMD64), source revision 929532a9426d085111c24c63de9c23cc54382259 Connection id: 98 Current database: Current user: mads@85.81.43.174 SSL: Cipher in use is ECDHE-RSA-AES256-GCM-SHA384 Current pager: stdout Using outfile: '' Using delimiter: ; Server: MariaDB Server version: 10.5.22-MariaDB MariaDB Server Protocol version: 10 Connection: eccentric.dk via TCP/IP Server characterset: latin1 Db characterset: latin1 Client characterset: utf8mb4 Conn. characterset: utf8mb4 TCP port: 3306 Uptime: 2 hours 24 min 5 sec
数据库SSL配置
MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%'; +---------------------+----------------------------------+ | Variable_name | Value | +---------------------+----------------------------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | /etc/mariadb/chain.pem | | ssl_capath | | | ssl_cert | /etc/mariadb/fullchain.pem | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | /etc/mariadb/privkey.pem | | version_ssl_library | OpenSSL 1.1.1k FIPS 25 Mar 2021 | +---------------------+----------------------------------+ 10 rows in set (0.036 sec)
TLS版本设置
MariaDB [(none)]> SHOW VARIABLES LIKE '%tls%'; +---------------+-------------------------+ | Variable_name | Value | +---------------+-------------------------+ | tls_version | TLSv1.1,TLSv1.2,TLSv1.3 | +---------------+-------------------------+
虚拟环境已安装包
Package Version ---------------------- ------- asgiref 3.7.2 Cython 3.0.6 Django 5.0 mariadb 1.1.8 mysql-connector-python 8.2.0 mysqlclient 2.2.0 packaging 23.2 pip 23.3.1 protobuf 4.21.12 sqlparse 0.4.4 tzdata 2023.3 wheel 0.42.0
解决方案
针对该SSL连接错误,可尝试以下修复方式:
指定CA证书路径
仅设置ssl: True可能导致客户端无法正确验证服务器证书,需明确指定本地下载的服务器chain.pem文件路径:DATABASES = { 'default': { # 保留其他原有配置 'OPTIONS': { 'ssl': { 'ca': '/path/to/local/chain.pem' } }, } }限制TLS版本
服务器支持TLSv1.1至TLSv1.3,部分客户端驱动可能与高版本TLS存在兼容性问题,尝试指定兼容版本:DATABASES = { 'default': { # 保留其他原有配置 'OPTIONS': { 'ssl': True, 'tls_versions': ['TLSv1.2', 'TLSv1.3'] }, } }注:不同驱动参数名有差异,mysqlclient用
tls_versions,mysql-connector-python可能需用ssl_verify_cert等参数。切换数据库驱动
当前安装了多套MySQL/MariaDB驱动,尝试切换到mariadb引擎:DATABASES = { 'default': { 'ENGINE': 'mariadb', # 保留其他原有配置 'OPTIONS': {'ssl': True}, } }确保
mariadb驱动版本与服务器兼容。修正端口配置
将PORT字段从空值改为明确的'3306',同时检查服务器防火墙是否允许客户端IP访问3306端口。验证证书有效性
确认本地CA证书未过期、格式正确,且与服务器chain.pem一致,可通过以下命令验证:openssl s_client -connect eccentric.dk:3306 -CAfile /path/to/local/chain.pem
内容的提问来源于stack exchange,提问作者msx
相关产品推荐
相关产品推荐

