将 MySQL 连接器与 Python 一起使用时出现 SSL 连接错误

Posted

技术标签:

【中文标题】将 MySQL 连接器与 Python 一起使用时出现 SSL 连接错误【英文标题】:SSL Connection Error while using MySQL Connector with Python 【发布时间】:2019-06-26 08:44:23 【问题描述】:

我在 Anaconda 的环境中使用 Python 3.6(但我在 Python 2.7 中遇到相同的错误)和 mysql-connector-python 来编写一个简单的脚本来访问托管在 Hostgator 中的数据库。这是错误:

Traceback (most recent call last):
  File "/home/usuario/anaconda3/envs/fakebook/lib/python3.6/site-packages/mysql/connector/connection_cext.py", line 176, in _open_connection
    self._cmysql.connect(**cnx_kwargs)
_mysql_connector.MySQLInterfaceError: SSL connection error: SSL_CTX_set_tmp_dh failed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "teste.py", line 6, in <module>
    passwd="senha"
  File "/home/usuario/anaconda3/envs/fakebook/lib/python3.6/site-packages/mysql/connector/__init__.py", line 172, in connect
    return CMySQLConnection(*args, **kwargs)
  File "/home/usuario/anaconda3/envs/fakebook/lib/python3.6/site-packages/mysql/connector/connection_cext.py", line 78, in __init__
    self.connect(**kwargs)
  File "/home/usuario/anaconda3/envs/fakebook/lib/python3.6/site-packages/mysql/connector/abstracts.py", line 731, in connect
    self._open_connection()
  File "/home/usuario/anaconda3/envs/fakebook/lib/python3.6/site-packages/mysql/connector/connection_cext.py", line 179, in _open_connection
    sqlstate=exc.sqlstate)
mysql.connector.errors.InterfaceError: 2026 (HY000): SSL connection error: SSL_CTX_set_tmp_dh failed

我的代码很简单,只是尝试连接数据库:

import mysql.connector

mydb = mysql.connector.connect(
    host="192.xxx.xxx.xx",
    user="root",
    passwd="senha"
)

print(mydb)

我在其他计算机上多次使用过这个库,我也通过我的计算机连接到同一个数据库,使用同一个库,并且它总是使用这个代码。我尝试使用 MySQL Workbench,似乎它正在使用与我的代码中相同的凭据连接到数据库。我已经尝试向服务器支持寻求帮助,我的 IP 被允许访问数据库,即使这样我也无法连接 Python。我试图重新安装库,但没有任何改变。

谢谢大家!

【问题讨论】:

尝试将ssl模式设置为无。 【参考方案1】:

我遇到了同样的问题,并通过添加 use_pure=True 参数来解决它,该参数基于 here 的建议:

import mysql.connector as sql

db_connection = sql.connect(host='****', database='****', user='****', password='****', use_pure=True)

我的 mac 上的相关软件包:mysql-connector-python 8.0.16openssl 1.1.1b 已安装(都是 anaconda)。

【讨论】:

这使它也适用于我,在 Mac OS,python3.7 mysql-connector-python 8.0.16 上。谢谢哈密! 这解决了我的问题。我刚刚在我的 ubuntu 18.04 驱动器上安装了 mysql 8.0.18 并遇到了这个问题。感谢我阅读的最简单的方法。 很好的解决方案,无需降级! :D【参考方案2】:

这似乎只在mysql-connector-python 库使用 C 扩展而不是纯 python 实现时发生。

自版本 8.0.11 起,默认值已更改,现在使用 C 扩展(如果存在)。https://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html

一种解决方案是通过该标志强制连接器使用 python 实现,只需将其添加到配置中的连接 url:

url = 'mysql+mysqlconnector://user:password@mysql_server/database?use_pure=True'

【讨论】:

没问题@Mysterio,就在昨天我还发现了这个:docs.sqlalchemy.org/en/13/dialects/… > MySQL 连接器/Python DBAPI 自发布以来有很多问题,其中一些可能仍未解决,mysqlconnector 方言是未作为 SQLAlchemy 持续集成的一部分进行测试。推荐的 MySQL 方言是 mysqlclient 和 PyMySQL。所以我改用 PyMySQL【参考方案3】:

我在我的 mac 上遇到了同样的问题,我正在运行 mysql-connector-python 版本 8.0.16,我通过降级到版本 8.0.5 解决了这个问题

【讨论】:

谢谢,这对我有用。如果您发现原因或得知他们会在未来的版本中修复它,请编辑您的答案 我不确定,它不适合我。 PackagesNotFoundError: - mysql-connector-python=8.0.5 我认为版本 8.0.5 不再列出【参考方案4】:

我遇到了完全相同的问题,但由于我无法使用 mlcr 的解决方案(它是一个 AWS RDS 数据库),我的解决方案有所不同。我不得不将 mysql-connector-python 版本从 8.x.x 更改为 2.2.3。这完全解决了我的问题。希望这可以帮助某人。

【讨论】:

【参考方案5】:

这对我有用(Ubuntu 16.04 LTS)。从终端:

    重新创建证书(datadir 是您的选择):

mysql_ssl_rsa_setup --datadir=/data/dir/

    将以下内容添加到/etc/mysql/mysql.conf.d/mysqld.cnf
ssl-ca=/data/dir/cacert.pem

ssl-cert=/data/dir/server-cert.pem

ssl-key=/data/dir/server-key.pem
    重启mysql服务器:sudo service mysql restart

【讨论】:

为什么我在这个mysql_ssl_rsa_setup --datadir=/data/dir/ 中出现错误:2019-11-21 08:45:15 [ERROR] Failed to access directory pointed by --datadir. Please make sure that directory exists and is accessible by mysql_ssl_rsa_setup. Supplied value : /data/dir /data/dir 只是我的路径示例。您需要将 --datadir= 指向系统上要创建证书的实际现有目录。甚至更好,请参阅下面的 juan 的解决方案。

以上是关于将 MySQL 连接器与 Python 一起使用时出现 SSL 连接错误的主要内容,如果未能解决你的问题,请参考以下文章

无法将实体框架与 MySQL 一起使用

将 MySQL 和 Spring Boot 应用程序与 docker 一起使用时出错

将 Celery 与 SQS 一起使用时 Errno 111 连接被拒绝

与两个连接的 python3 脚本一起使用时的 argparse 冲突

.NET MySQL 连接器冲突的 DbProviderFactories

哪个数据库与 Django 和 Python 3 一起使用? [关闭]