无法使用PyMySQL与远程MySQL服务器建立TLS TCP连接,其他工具也可以使用

时间:2019-04-10 16:41:26

标签: python ssl pymysql

使用TLS连接以确保安全,设置要与中央MySQL数据库通信的新服务器

按照this之类的步骤,我已经能够为我的MySQL服务器设置TLS,已经使多个用户能够从任何主机(%)登录,并且需要SSL连接

+------------+-----------+----------+
| user       | host      | ssl_type |
+------------+-----------+----------+
| testuser   | %         | ANY      |
+------------+-----------+----------+

我可以通过使用HeidiSQL或MySQL CLI工具之类的工具在任何主机上进行确认 例如:mysql -u testuser -p -h mysql_server_IP将启动TLS连接,如\ s所确认 这排除了我在此论坛和其他论坛上看到的大多数问题,这是由将主机设置为localhost引起的。

访问本地数据库时,以下工作正常。连接到非TLS远程数据库服务器时,它也可以正常工作。

import pymysql.cursors

connection = pymysql.connect(host=host,
                             user=user,
                             password=password,
                             db=db,
                             cursorclass=pymysql.cursors.DictCursor)

当尝试使用require-tls访问服务器时,出现以下错误 pymysql.err.OperationalError: (1045, "Access denied for user 'testuser'@'desktop.example.com' (using password: YES)")

我发现的其他发现是由于以下原因引起的: 无效的用户名/密码组合,或该主机禁止的连接。但是,我知道我可以从该主机建立连接,如CLI所示。

1 个答案:

答案 0 :(得分:0)

在连接到my.cnf中仅包含require_secure_transport = ON的服务器时,PyMySQL在无法启动TLS连接方面给出了更明显的错误。 pymysql.err.InternalError: (3159, 'Connections using insecure transport are prohibited while --require_secure_transport=ON.'但是,如果MySQL用户本身需要SSL,您会从上述问题中得到更为通用的拒绝权限错误。

github issue tracker上提到了提供CA .pem文件。如果您无权访问这些文件,并希望隐式信任自签名证书。 docs提到-ssl标志,它允许您传递各种证书文件的路径。

但是,通过传入有效的字典而没有任何有效的密钥,您可以有效地覆盖信任自签名证书。示例:

connection = pymysql.connect(host=host,
                             user=user,
                             password=password,
                             db=db,
                             cursorclass=pymysql.cursors.DictCursor,
                             ssl={"fake_flag_to_enable_tls":True})