【发布时间】:2017-03-06 08:59:23
【问题描述】:
在将我的项目从 PHP 5.6 迁移到 PHP 7 时,我遇到了一个奇怪的问题,我有一个数据库类,它允许您在调用 mysqli_init(); 和调用 mysqli_real_connect() 之前设置与数据库的 SSL 连接。
我一直在 PHP 5.6 上开发此功能,并成功创建了与远程服务器的 SSL 连接,一切正常,远程数据库服务器不使用自签名证书。
在我的 db 类的 setSSL 方法中,我有这个:
if($verify) { $this->mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true); }
$this->mysqli->ssl_set($key, $cert, $ca, $capath, $ciphers);
该方法将$verify 设置为默认设置true 并保持原样,证书包通过变量$ca 传递。
这在 PHP 5.6 上运行良好,并且完全按照应有的方式运行,并确认该连接确实使用了 SSL 连接。
在同一台服务器上,我创建了一个子域并将其设置为使用 PHP 7(我听说性能要好得多,而且我的代码对 PHP 7 友好)。
我在新子域上完成了我的代码的完整副本,一切正常,除了远程 SSL mysqli 连接。
我已经检查了 PHP 7 中删除的功能和许多其他内容,但无法找出发生这种情况的原因。
从日志中提取:
[Msg: mysqli::real_connect(): SSL 操作失败,代码为 1。 OpenSSL 错误消息:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败]
[Msg: mysqli::real_connect(): 无法使用 SSL 连接到 MySQL]
[Msg: mysqli::real_connect(): [2002] (尝试通过 tcp://******.co.uk:3306)]
另一方面,如果我没有通过 ca 证书包,这与我第一次在 PHP 5.6 上开发此功能时产生的错误相同。
【问题讨论】:
-
错误日志中有什么内容?
-
感谢@neuhaus 的回复我已经用日志的摘录更新了这个问题。如上所述,这在 5.6 中运行良好,但在 PHP 7 中中断。我已经确认 ca 文件的正确位置正在传递给 ssl_set 方法。
标签: php ssl mysqli upgrade php-7