PHP 7.1使用SSL连接到远程数据库的CLI与Abort陷阱失败:6

时间:2017-10-03 01:56:46

标签: php ssl mysqli google-cloud-sql

我有一个PHP CLI脚本,我用它来通过SSL建立一个mysql连接:

$SourceStorageAccountName = "<SourceStorageAccountName>"
$SourceStorageKey = Get-AzureStorageKey -StorageAccountName $SourceStorageAccountName
$StorageContext = New-AzureStorageContext -StorageAccountName $SourceStorageKey.StorageAccountName -StorageAccountKey $SourceStorageKey.Primary
$containers = Get-AzureStorageContainer -Context $StorageContext

foreach ($c in $containers) {
    "Transfer container " + $c.Name
    $cmd = "C:\'Program Files (x86)'\'Microsoft SDKs'\Azure\AzCopy\AzCopy.exe /Source:" + $c.CloudBlobContainer.Uri.AbsoluteUri + " /Dest: +"youfile path"

    Invoke-Expression $cmd
}

我希望这会通过SSL建立与远程Mysql Server(Google Cloud SQL)的连接,但脚本会报告Abort Trap 6:我认为这是一个C错误?经过一些谷歌搜索后,我想也许可以访问.pem文件。它们是世界可读的[ValidPath]是完全合格的。我知道.pem文件很好,因为它们与MySQLWorkBench使用的相同,并且连接在SSL上很好。如果我注释掉$ DBlink-&gt; ssl_set行,那么我得到 $DBlink = mysqli_init(); mysqli_options ($DBlink, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true); $DBlink->ssl_set('[ValidPath]/client-key.pem', '[ValidPath]/client-cert.pem', '[ValidPath]/ca-cert.pem', NULL, NULL) $link = mysqli_real_connect ($DBlink, 'IP', 'USER', 'PASSWORD', 'DB', 3306, NULL, MYSQLI_CLIENT_SSL); 所以看起来我的脚本正在与服务器通信。似乎ssl_set导致Abort。

我按照Google Cloud SQL上的说明进行网络授权。就像我说的那样。使用MySQLWorkBench连接到同一个实例非常有效。另外,连接:

Connect error (1045): Access denied for user 'user'@'xx.xx.xx.xx' (using password: YES)

也很完美。那么,似乎有些东西是用PHP填写的?

我在MacOS 10.12.6上使用PHP CLI 7.1.8版的脚本。

mysql --ssl-ca=server-ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem \
             --host=[INSTANCE_IP] --user=root --password

我很难过。有没有人遇到过这个? SSL版本不兼容吗?

1 个答案:

答案 0 :(得分:0)

SSL验证失败的原因应该很简单,但是挑战在于PHP崩溃Abort Trap: 6,并且不会打印出有意义的错误消息来解释根本原因。

有多种可能的原因。我这样做时遇到了这个问题:

$mysqli->real_connect("<host>:3306", $user, $password, $database, NULL, NULL, MYSQLI_CLIENT_SSL);

但这可行:

$mysqli->real_connect("<host>", $user, $password, $database, 3306, NULL, MYSQLI_CLIENT_SSL);

我还看到了一个StackOverflow问题,如果数据库正在侦听localhost,则从“ localhost”更改为“ 127.0.0.1”可以解决该问题。您也可能会遇到其他失败原因。

通常,这些方法可以帮助您找出原因:

  1. 配置PHP以启用php.ini中的错误记录。也许有意义的错误消息将被打印出来。
  2. 尝试从mysql命令行工具连接到数据库,以验证SSL连接。
  3. 在互联网上搜索示例代码,例如https://github.com/search?q=MYSQLI_OPT_SSL_VERIFY_SERVER_CERT&type=Code,与您自己的代码进行比较以发现差异。