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

时间:2020-04-19 16:51:07

标签: python google-cloud-platform sqlalchemy google-cloud-sql

我正在尝试使用Python 3连接到GCP Cloud SQL实例,并且不想使用云代理,我只想直接使用SSL证书进行连接,因此我遵循了GCP指南here进行连接用ssl密钥保护的公共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,“用户的访问被拒绝 'root'@'1.2.3.4'(使用密码:是)“)(此错误的背景信息位于: http://sqlalche.me/e/e3q8

如果不是因为我:

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

我想念什么?

1 个答案:

答案 0 :(得分:0)

好,终于成功了。错误消息具有误导性,因为您希望它与将我的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())

mysqlclient需要一个带有密钥对的名为ssl的字典,但是我在堆栈上可以找到的所有其他答案都是错误的,或者它们已经被更改了。

以下是作为参数传递所需的字典链接:

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:客户端公共密钥证书文件的路径名。
  • ca:证书颁发机构(CA)证书文件的路径名。 如果使用此选项,则必须指定由 服务器。
  • capath:包含受信任的SSL CA的目录的路径名 证书文件。
  • cipher:SSL加密的允许密码列表。