mysqli_real_connect()获得SSL3_GET_SERVER_CERTIFICATE

2019-10-29 07:43发布

我们刚刚升级到从PHP 5.4 PHP的5.6和一切工作正常使用我们的MySQL使用的MySQLi和SSL连接。

我们连接的样子:

mysqli_real_connect($db, $host, $username, $password, $database, $port, $socket, MYSQLI_CLIENT_SSL);
mysqli_set_charset($db, "utf8");

Howerver,现在当我们尝试使用PHP 5.6,我们正在连接到MySQL通过SSL:

警告:mysqli_real_connect():SSL操作失败,代码1的OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败在/MySQLConnection.php上线29

警告:mysqli_real_connect():无法通过在线29 /MySQLConnection.php使用SSL连接到MySQL

警告:mysqli_real_connect():[2002](试图通过TCP连接://mysql1.ourdomain.com:3306)在/MySQLConnection.php在线29

警告:mysqli_real_connect():(HY000 / 2002):在/MySQLConnection.php在线29

我试着设置:

mysqli_options($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, false);

但是,这并不能帮助。

UPDATE

我说:

$mysql_certs_path = "/full/path/to/certs/mysql";
mysqli_ssl_set($db, $mysql_certs_path . "/client-key.pem", $mysql_certs_path . "/client-cert.pem", $mysql_certs_path . "/ca-cert.pem", null, null);

而仍然得到:

警告:mysqli_real_connect():SSL操作失败,代码1的OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败在/MySQLConnection.php上线31

 Warning: mysqli_real_connect(): Cannot connect to MySQL by using SSL in /MySQLConnection.php on line 31 

Answer 1:

@jww,我已经写了这股究竟@Justin正面临着这里的问题后。 据我的职务 ,由谷歌云SQL颁发的证书的CN有模式:

CN=project-name:instance-id


Answer 2:

有类似这种发生在我身上的东西。 当我升级PHP到5.6,它的工作。 但是,当我进入:

sudo apt-get install php5-mysqlnd

在Ubuntu 15.04中,SSL到AWS RDS停止工作,即使它与驾驶员的libmysql工作。 运行:

sudo apt-get install php5-mysql

安装的老司机,并开始工作了。 近,我可以计算出,它的失败用于连接到RDS同行名称验证。 我不知道如何解决这个问题,因为它使用PHP流它的连接,设置似乎并不在乎你的过去。

这是一个已知的bug:

https://bugs.php.net/bug.php?id=68344

所以我写了这个方法,此处修改: 如何知道MySQLnd是活动的驱动程序?

public function getMySQLIType()
{
    $mysqlType = [
        'mysql' => false,
        'mysqli' => false,
        'mysqlnd' => false,
    ];

    if (function_exists('mysql_connect')) {
        $mysqlType['mysql'] = true;
    }

    if (function_exists('mysqli_connect')) {
        $mysqlType['mysqli'] = true;
    }

    if (function_exists('mysqli_get_client_stats')) {
        $mysqlType['mysqlnd'] = true;
    }

    return $mysqlType;
}

如果数组返回mysqlnd真的,我禁用SSL。 如果返回false,那么我启用它。 迄今为止,它的工作原理。 是的,这是一个黑客修复,但我不知道如何合理地解决这个问题。



文章来源: mysqli_real_connect() getting SSL3_GET_SERVER_CERTIFICATE:certificate verify failed