在 perl 中从 GCE 远程连接到 Google 云 SQL 时出错



在 Debian Buster 上使用 Perl DBD:mysql 4.0502.

my $dbh = DBI->connect_cached(
'DBI:mysql:<db>:<host>;mysql_ssl=1;mysql_ssl_ca_file=/etc/ssl/mysql/server-ca.pem;mysql_ssl_client_cert=/etc/ssl/mysql/client-cert.pem;mysql_ssl_client_key=/etc/ssl/mysql/client-key.pem', 
<username>, <pass>);

尝试通过SSL连接到Google Cloud SQL(Mysql(实例,我反复收到错误:SSL connection error: Error while reading file.SSL connection error: Error in the certificate.

我已经对目录进行了chown,将所有权转移到mysql:mysql,尝试了各种所有权配置,甚至移动了目录。

我已经使用与脚本中相同的参数通过 CLI 进行连接,通过脚本通过主机的不安全 SSL 进行连接,但是一旦我仅通过 SSL 限制连接并使用这些命令,就会出现相同的错误。

更新: 在对此进行了更多挖掘之后,我认为问题在于Google如何为其客户端密钥和证书(Cloud SQL上的证书验证(签署主机名。这里的建议不适用于Perl的DBD::mysql,因为他们决定在使用SSL(https://github.com/perl5-dbi/DBD-mysql/issues/110(时强制执行主机名验证。

我仍在寻找解决此问题的方法,但我现在正在研究未来的私有 IP 和 VPC。

在撰写本文时,Perl 不是与 Google Cloud Platform 交互的受支持语言。即使您成功实现了 perl 脚本以连接到 Cloud SQL 实例,鉴于其临时性质,该解决方案也有可能在某一天停止工作。确实实现并积极维护了多个其他语言的客户端库。如果您想以编程方式与 GCP 服务进行交互,我强烈建议切换到这些库之一。此外,对于任何不便,您将得到支持团队或通过 Github 问题的直接帮助。

话虽如此,一种可能的解决方法可能是从perl脚本调用mysql客户端,就像在linux shell中一样。这个想法是将sql语句编写在一个文件中,并运行mysql命令行工具来提供语句文件。这种方法有明显的警告,如果您需要交互式会话,它根本不起作用,但可能会完成从perl脚本触发简单任务的工作。我正在分享我制作的一个小片段。

-- sql statements file
show databases;
#!/usr/bin/perl
$data = `mysql --user=root --password=XXX  --host=XXX.XXX.XXX.XXX < file.sql`;
print("$data");

请记住,从安全的角度来看,以这种方式公开密码是一个糟糕的主意。此外,此方法需要在 SQL 实例的"连接"选项卡中将 GCE 外部 IP 列入白名单,如下所示。


编辑:可以在此处找到连接到Cloud SQL的支持库列表,几乎所有库都需要使用cloud_sql_proxy,其配置在同一文档中进行了解释(向上滚动(。

另外,还有一些库可以像使用 gcloud 命令行工具一样管理您的实例,可以在此处找到

相关内容

  • 没有找到相关文章

最新更新