0

我们刚刚从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");

但是,现在当我们尝试使用 php 5.6 通过 SSL 连接到 MySQL 时,我们得到:

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

警告:mysqli_real_connect():无法在第 29 行的 /MySQLConnection.php 中使用 SSL 连接到 MySQL

警告:mysqli_real_connect(): [2002](尝试通过 tcp://mysql1.ourdomain.com:3306 连接)在第 29 行的 /MySQLConnection.php

警告:mysqli_real_connect(): (HY000/2002): in /MySQLConnection.php on line 29

我尝试设置:

mysqli_options($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, false);

但这无济于事。

更新

我补充说:

$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:第 31 行 /MySQLConnection.php 中的证书验证失败

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

2 回答 2

0

@jww,我写了一篇文章,分享了@Justin 在这里面临的问题。根据我的帖子,Google Cloud SQL 颁发的证书的 CN 有以下模式:

CN=project-name:instance-id
于 2015-04-18T13:54:21.460 回答
0

有类似的事情发生在我身上。当我将 PHP 升级到 5.6 时,它起作用了。但是当我进入时:

sudo apt-get install php5-mysqlnd

在 Ubuntu 15.04 上,AWS RDS 的 SSL 停止工作,即使它与 libmysql 驱动程序一起工作。跑步:

sudo apt-get install php5-mysql

安装了旧的驱动程序,它又开始工作了。据我所知,连接到 RDS 的对等名称验证失败。我不知道如何解决这个问题,而且因为它使用 PHP 流进行连接,所以你传入的设置似乎并不重要。

这是一个已知的错误:

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

所以我写了这个方法,从这里修改: How to know if MySQLnd is the active driver?

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 返回 true,我将禁用 SSL。如果返回 false,那么我启用它。到目前为止,它有效。是的,这是一个 hack 修复,但我不知道如何合法地解决这个问题。

于 2015-12-16T01:25:37.553 回答