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

Jul*_*lio 7 python mysql python-2.7 python-3.x

我在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
Run Code Online (Sandbox Code Playgroud)

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

import mysql.connector

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

print(mydb)
Run Code Online (Sandbox Code Playgroud)

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

谢谢大家!

jua*_*uan 7

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

8.0.11版本开始,默认值已更改,如果存在C扩展名,则现在使用C扩展名。
https://dev.mysql.com/doc/connector-python/zh-CN/connector-python-connectargs.html

use_pure参数说明

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

url = 'mysql+mysqlconnector://user:password@mysql_server/database?use_pure=True'
Run Code Online (Sandbox Code Playgroud)

  • 这挽救了我的一天!谢谢胡安 (2认同)
  • 没问题@Mysterio,就在昨天,我也发现了这一点:https://docs.sqlalchemy.org/en/13/dialects/mysql.html#module-sqlalchemy.dialects.mysql.mysqlconnector&gt; MySQL Connector / Python DBAPI已经拥有自发行以来存在许多问题,其中一些问题可能尚未解决,并且mysqlconnector方言未作为SQLAlchemy持续集成的一部分进行测试。推荐的MySQL方言是mysqlclient和PyMySQL。所以我切换到PyMySQL (2认同)

mlc*_*lcr 5

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

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

mysql_ssl_rsa_setup --datadir=/data/dir/

  1. 将以下内容添加到/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
Run Code Online (Sandbox Code Playgroud)
  1. 重启mysql服务器: sudo service mysql restart


HaM*_*aMi 5

我有同样的问题,并通过在此处添加use_pure=True基于建议的论点来解决:

import mysql.connector as sql

db_connection = sql.connect(host='****', database='****', user='****', password='****', use_pure=True)
Run Code Online (Sandbox Code Playgroud)

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