如何使用 SSL 将 SQLAlchemy 连接到 GCP CLoud SQL 实例?

How to connect SQLAlchemy to a GCP CLoud SQL instance using SSL?

我正在尝试使用 Python 3 连接到 GCP Cloud SQL 实例并且不想使用云代理,我只想使用 SSL 证书直接连接所以我遵循了GCP 指南 here 从使用 ssl 密钥保护的 public IP 连接。

使用这个适用于 mysql 客户端:

mysql -uroot -pMyPassWord -h 1.2.3.4 --ssl-ca=server-ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem

但是当我做我认为与 Python 相同的事情时,我得到一个错误:

from sqlalchemy import create_engine

db_connect_string='mysql+mysqldb://root:MyPassWord@1.2.3.4:3306/mydb'
ssl_args = {'ssl': {'ssl_cert':'./client-cert.pem', 'ssl_key':'./client-key.pem', 'ssl_ca':'./server-ca.pem'}}
engine = create_engine(db_connect_string, connect_args=ssl_args)

print(engine.table_names())

错误是:

sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1045, "Access denied for user 'root'@'1.2.3.4' (using password: YES)") (Background on this error at: http://sqlalche.me/e/e3q8)

如果不是因为我:

  1. 已将我的 public IP 地址 1.2.3.4/32 添加为授权网络。
  2. 我可以通过 mysql 客户端访问,为什么限制在那里不适用?

我错过了什么?

好的,终于可以正常使用了。该错误消息具有误导性,因为您认为它与将我的 IP 列入白名单有关,但事实并非如此。这是工作代码:

from sqlalchemy import create_engine

db_connect_string='mysql+mysqldb://root:MyPassWord@1.2.3.4:3306/mydb'
ssl_args = {'ssl': {'cert':'./client-cert.pem', 'key':'./client-key.pem', 'ca':'./server-ca.pem'}}
engine = create_engine(db_connect_string, connect_args=ssl_args)

print(engine.table_names())

mysql客户端需要一个名为 ssl 的字典和密钥对,但我在堆栈中找到的所有其他答案要么是错误的,要么可能已被更改。

这是需要作为参数传递给字典的link:

https://mysqlclient.readthedocs.io/user_guide.html#installation

这里是 MySQL 解释参数的文档:

https://dev.mysql.com/doc/refman/8.0/en/mysql-ssl-set.html

这里是完整的参数列表:

  • mysql: 从 mysql_init() 返回的连接处理程序。
  • key:客户端私钥文件的路径名。
  • cert: 客户端public密钥证书文件的路径名。
  • ca:证书颁发机构 (CA) 证书文件的路径名。 如果使用此选项,则必须指定 服务器。
  • capath: 包含受信任的 SSL CA 的目录的路径名 证书文件。
  • cipher:SSL 加密允许的密码列表。