python - Django:SSL 证书问题(“SSL 连接错误:收到的消息意外或格式错误”)
问题描述
我正在使用 Windows 10、Python 3.7.6。使用以下软件包:
# Name Version Build Channel
mysql-connector-c 6.1.11 he025d50_1002 conda-forge
mysqlclient 1.4.6 pypi_0 pypi
sqlalchemy 1.3.12 py37hfa6e2cd_0 conda-forge
sqlite 3.30.1 hfa6e2cd_0 conda-forge
sqlparse 0.3.0 py_0 conda-forge
django 3.0.2 py37_0 conda-forge
django-classy-settings 2.1.1 pypi_0 pypi
django-debug-toolbar 2.1 py_0 conda-forge
我正在使用具有以下设置的 MySQL 数据库。该数据库是使用我公司内的 IT 云数据服务创建的。我下载了 SSL 证书并将它们放在我的 django 项目中。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'MyTestTVPVDb',
'USER': 'MyTestTVPVDb_so',
'PASSWORD': 'YYYYYYYYYYYYYYYYYYY',
'HOST': 'XXXXXXXXXXXXXXXXXXXXXXX',
'PORT': '3307',
'OPTIONS': {
'ssl': {
'ssl-ca': os.path.join(SSL_CERT_ROOT, 'ca_cert.pem'),
}
}
}
}
现在,当我输入 时python manage.py dbshell
,我可以正常连接到数据库,并且一切正常。我可以看到数据库支持 SSL。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 476212
Server version: 5.5.5-10.0.20-MariaDB-wsrep-log MariaDB Server, wsrep_25.10.r4144
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> status
--------------
mysql Ver 8.0.18 for Win64 on x86_64 (MySQL Community Server - GPL)
Connection id: 476212
Current database: MyTestTVPVDb
Current user: MyTestTVPVDb_so@XXXXXXXXXXXXXXXXXXXXXXXXXXXX
SSL: Cipher in use is DHE-RSA-AES256-SHA
Using delimiter: ;
Server version: 5.5.5-10.0.20-MariaDB-wsrep-log MariaDB Server, wsrep_25.10.r4144
Protocol version: 10
Connection: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX via TCP/IP
Server characterset: utf8
Db characterset: utf8
Client characterset: cp850
Conn. characterset: cp850
TCP port: 3307
Uptime: 18 days 7 hours 12 min 24 sec
Threads: 35 Questions: 1394611 Slow queries: 268 Opens: 87 Flush tables: 1 Open tables: 96 Queries per second avg: 0.882
但是,当我键入python manage.py runserver
启动服务器时,我得到以下我不知道如何解决的异常。
INFO Watching for file changes with StatReloader
Performing system checks...
Exception in thread django-main-thread:
Traceback (most recent call last):
File "C:\Anaconda3\lib\site-packages\django\db\backends\base\base.py", line 220, in ensure_connection
self.connect()
File "C:\Anaconda3\lib\site-packages\django\utils\asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "C:\Anaconda3\lib\site-packages\django\db\backends\base\base.py", line 197, in connect
self.connection = self.get_new_connection(conn_params)
File "C:\Anaconda3\lib\site-packages\django\utils\asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "C:\Anaconda3\lib\site-packages\django\db\backends\mysql\base.py", line 233, in get_new_connection
return Database.connect(**conn_params)
File "C:\Anaconda3\lib\site-packages\MySQLdb\__init__.py", line 84, in Connect
return Connection(*args, **kwargs)
File "C:\Anaconda3\lib\site-packages\MySQLdb\connections.py", line 179, in __init__
super(Connection, self).__init__(*args, **kwargs2)
MySQLdb._exceptions.OperationalError: (2026, 'SSL connection error: The message received was unexpected or badly formatted')
如果我将mysqlclient
包从 v1.4.6 降级到 v1.3.14,服务器启动正常。
(base) C:\Users\XXXX\Desktop\PyCharmProjects\personal-work-repo\python\src\tvpv_portal>conda list mysql
# packages in environment at C:\Anaconda3:
#
# Name Version Build Channel
mysql-connector-c 6.1.11 he025d50_1002 conda-forge
mysqlclient 1.3.14 py37he774522_0 defaults
(base) C:\Users\XXXX\Desktop\PyCharmProjects\personal-work-repo\python\src\tvpv_portal>python manage.py runserver
INFO Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
January 03, 2020 - 02:55:23
Django version 3.0.2, using settings 'tvpv_portal.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
任何想法这里出了什么问题?SSL证书有问题吗?
解决方案
我通过将 MariaDB 从 v10.0 -> v10.2 切换来解决了这个问题。看起来 mysqlclient v1.4.6 不适用于 MariaDB v10.0
推荐阅读
- javascript - 如何完成订单审核并发送到下订单时指定的用户电子邮件地址作为确认消息
- r - R Leaflet:将多个组分配给一个图层
- angular - 如何加载模板 Angular 并渲染它?
- vba - 采用动态数组并返回动态数组的 VBA 函数
- cassandra - Cassandra 3.11:从源代码构建时出现 Java 不匹配错误
- python - 基于列值的百分比减少
- kubernetes - 故障样本 prometheus 和 cadvisor
- java - 代码在必须时没有按下按钮
- java - 如何在 Java JDK 11 中设置实体扩展限制
- laravel - Laravel Livewire 模型属性绑定