python - Django:SSL 证书 ("SSL connection error: The message received was unexpected or badly formatted"问题)

标签 python django ssl ssl-certificate

我使用的是 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 dbshel​​l 时,我能够正常连接到数据库,一切看起来都正常。我可以看到数据库支持 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 一起工作

关于python - Django:SSL 证书 ("SSL connection error: The message received was unexpected or badly formatted"问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59577369/

相关文章:

python - 使用 appengine-mapreduce 达到内存限制

python - 将文本语料库转换为具有vocabulary_id 和相应 tfidf 分数的文本文档

python - 我如何猴子修补另一个包的管理类?

java - 如何在 Java 中使用 "Multiple"SSL 证书?

java - 有没有办法使用 WebFlux 在 Azure Kubernetes 服务中配置 SSL 证书而不使用 Java keyStore?

python - 解码字节而不丢失数据

python - 无法在 Flask 中启用 Debug模式

Django循环–删除最后一个逗号

html - 在渐进式 Web 应用程序中使用水平滚动条显示图像

php - 在 PHP 中使用 ssl 证书时出错