php 7升级后,MySQLi SSL连接停止工作

时间:2016-10-24 14:21:11

标签: php ssl mysqli upgrade php-7

将项目从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上开发此功能时,会产生同样的错误。

1 个答案:

答案 0 :(得分:1)

我99%肯定这是因为您使用链式证书(这是常见的)和MySQL目前does not support chained certificates(这很烦人)。

您通常将中间证书加载到客户端证书池中,因为这会降低安全性并且是许多网络服务器所有者常常犯的错误。 但由于没有其他关于MySQL的解决方案,您可能只想这样做 这一点。

因此,作为一种解决方法,请尝试将CA 所有中间证书加载到PHP的证书池中 - 请记住这是不好的做法。

<强>更新

我认为这个漏洞很久以前就得到了解决,但是MySQL团队并没有更新他们的故障单......根据你的MySQL(通常是openssl)中的哪个ssl库它应该已经可以工作了。

在此处阅读如何连接和构建正确的证书链:How to chain a SSL certificate