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



我正试图使用Python 3连接到GCP Cloud SQL实例,不想使用云代理,我只想使用SSL证书直接连接,所以我遵循了GCP指南,从使用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'(使用密码:YES("((此错误的背景信息:http://sqlalche.me/e/e3q8)

如果不是因为I:

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

我缺少什么?

OK终于完成了这项工作。错误消息是误导性的,因为你会认为它与我的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加密允许的密码列表

相关内容

  • 没有找到相关文章

最新更新