我正试图使用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:
- 已经将我的公共IP地址1.2.3.4/32添加为授权网络
- 我可以通过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加密允许的密码列表