首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP 7.1 CLI通过SSL连接到远程数据库失败,并显示中止陷阱:6

PHP 7.1 CLI通过SSL连接到远程数据库失败,并显示中止陷阱:6
EN

Stack Overflow用户
提问于 2017-10-03 09:56:46
回答 1查看 603关注 0票数 0

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

代码语言:javascript
复制
    $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建立到远程Mysql服务器(Google Cloud SQL)的连接,但是,脚本报告Abort Trap 6:我认为这是C错误?在谷歌搜索之后,我认为也许可以访问.pem文件。它们是全球可读的,ValidPath是完全合格的。我知道.pem文件很好用,因为它们和MySQLWorkBench使用的文件是一样的,而且通过SSL的连接也很好。如果我注释掉$DBlink->ssl_set行,那么我会得到Connect error (1045): Access denied for user 'user'@'xx.xx.xx.xx' (using password: YES),所以看起来我的脚本正在与服务器对话。似乎是ssl_set导致了中止。

我按照Google Cloud SQL上的说明进行了网络授权。就像我说的。使用MySQLWorkBench连接到相同的实例可以完美地工作。另外,连接到:

代码语言:javascript
复制
mysql --ssl-ca=server-ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem \
             --host=[INSTANCE_IP] --user=root --password

它也能完美地工作。那么,看起来PHP有什么地方出问题了?

我将该脚本与MacOS 10.12.6上的PHP版本7.1.8一起使用。

代码语言:javascript
复制
SSL info from php -i | grep SSL

SSL => Yes
SSL Version => SecureTransport
core SSL => supported
extended SSL => supported
OpenSSL support => enabled
OpenSSL Library Version => OpenSSL 1.0.2l  25 May 2017
OpenSSL Header Version => OpenSSL 1.0.2l  25 May 2017
OpenSSL support => enabled

我被难住了。有没有人遇到过这种情况?SSL版本是否不兼容?

EN

回答 1

Stack Overflow用户

发布于 2020-03-02 12:03:22

SSL验证失败的原因应该很简单,但问题是Abort Trap: 6会导致PHP崩溃,并且不会输出有意义的错误消息来解释根本原因。

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

代码语言:javascript
复制
$mysqli->real_connect("<host>:3306", $user, $password, $database, NULL, NULL, MYSQLI_CLIENT_SSL);

但这是可行的:

代码语言:javascript
复制
$mysqli->real_connect("<host>", $user, $password, $database, 3306, NULL, MYSQLI_CLIENT_SSL);

我还看到了一个StackOverflow问题,将" localhost“更改为"127.0.0.1”解决了问题,以防数据库正在侦听localhost。你可能还会遇到其他失败的原因。

通常,这些方法可能会帮助您找出根本原因:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46536121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档