You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django数据库配置中设置TLS 1.2版本,解决Azure上MySQL 8.0.15服务器强制最低TLS1.2后的连接崩溃问题

解决Django应用连接强制TLSv1.2的Azure MySQL问题

你的问题核心出在Django MySQL驱动对SSL版本参数的预期格式上——你用了Python ssl模块的常量ssl.PROTOCOL_TLSv1_2,但mysqlclient(Django默认的MySQL后端驱动)的SSL配置需要的是字符串格式的TLS版本标识,而非这个枚举值。下面是具体的解决方案:

1. 修改SSL配置参数

把'ssl-version'的值改成字符串'TLSv1.2',底层MySQL客户端库期望接收这种格式的参数。修改后的完整配置如下:

import os

DATABASES[database_name] = {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': database_name,
    'USER': os.getenv("DB_USER"),
    'PASSWORD': os.getenv("DB_PASSWORD"),
    'HOST': os.getenv("DB_HOST"),
    'OPTIONS': {
        'ssl': {
            'ssl-ca': 'configs/public-azure-mysql-certificate.pem',
            'ssl-version': 'TLSv1.2'  # 替换为字符串格式的版本标识
        }
    }
}

2. 额外排查点(如果修改后仍无法连接)

  • CA证书路径与权限:确保public-azure-mysql-certificate.pem的路径正确,且Django进程有读取该文件的权限。建议使用绝对路径替代相对路径,避免路径解析问题。
  • 驱动版本检查:确认mysqlclient版本在2.0.0以上,旧版本可能对TLS 1.2的支持存在缺陷。可以通过pip install --upgrade mysqlclient升级到最新版。
  • 如果使用PyMySQL:若你的项目用PyMySQL替代了默认的mysqlclient,需要把TLS版本配置放在OPTIONS根目录下,而非ssl字典内:
    DATABASES[database_name] = {
        # 其他配置项不变
        'OPTIONS': {
            'ssl': {'ssl-ca': 'configs/public-azure-mysql-certificate.pem'},
            'tls_version': 'TLSv1.2'  # PyMySQL专属的配置方式
        }
    }
    
  • Python SSL支持验证:Python 3.8原生支持TLS 1.2,但可以通过以下代码确认OpenSSL版本是否达标(Azure MySQL要求最低OpenSSL 1.0.1):
    import ssl
    print("OpenSSL版本:", ssl.OPENSSL_VERSION)
    print("支持的TLS协议:", [name for name in dir(ssl) if 'PROTOCOL_TLS' in name])
    

3. 先测试连接再启动应用

修改配置后,建议先写一个简单脚本验证连接是否正常,再启动Django应用:

import mysql.connector
import os

config = {
    'user': os.getenv("DB_USER"),
    'password': os.getenv("DB_PASSWORD"),
    'host': os.getenv("DB_HOST"),
    'database': database_name,
    'ssl_ca': 'configs/public-azure-mysql-certificate.pem',
    'ssl_version': 'TLSv1.2'
}

try:
    cnx = mysql.connector.connect(**config)
    print("数据库连接成功!")
    cnx.close()
except Exception as e:
    print(f"连接失败原因:{str(e)}")

如果这个脚本能成功连接,说明配置没问题,再切换回Django的配置即可。

内容的提问来源于stack exchange,提问作者Ahmet Bahadır Eyuboğlu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 21:02:46