如何在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
相关产品推荐
相关产品推荐

