通过SSL与PHP mysqli的Mysql连接

通过SSL与PHP mysqli的Mysql连接,php,mysql,ssl,mysqli,Php,Mysql,Ssl,Mysqli,我正在尝试为两台VPS服务器设置到MariaDB数据库的PHP mysqli连接,并且需要加密通信,因为它是通过公共网络进行的 目前,我可以通过命令行mysql客户端正常地从客户机服务器连接到数据库服务器,并且我已经通过tcpdump检查了连接是否加密。但是由于某些原因,我无法理解PHP部分。这是相对基本的nginx+php5 fpm+mariadb设置,但mysql使用的是非默认端口。 Debian Jessie,Php5 5.6.7,Mariadb 10.0.16,nginx 1.6.2 以

我正在尝试为两台VPS服务器设置到MariaDB数据库的PHP mysqli连接,并且需要加密通信,因为它是通过公共网络进行的

目前,我可以通过命令行mysql客户端正常地从客户机服务器连接到数据库服务器,并且我已经通过tcpdump检查了连接是否加密。但是由于某些原因,我无法理解PHP部分。这是相对基本的nginx+php5 fpm+mariadb设置,但mysql使用的是非默认端口。 Debian Jessie,Php5 5.6.7,Mariadb 10.0.16,nginx 1.6.2

以下是测试脚本:

   <?php
        $DB_NAME = '';
        $DB_HOST = '111.111.111.111';
        $DB_USER = 'username';
        $DB_PASS = 'password';

$mysqli = mysqli_init();
if (!$mysqli) {
    die('mysqli_init failed');
}
//have tried witha and without the following with multiple variations
$mysqli->ssl_set(NULL, NULL, NULL,'/etc/mysql/ssl/',NULL);
if (!$mysqli->real_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME, 11111, NULL,MYSQLI_CLIENT_SSL )) {
    die('Connect Error (' . mysqli_connect_errno() . ') '
            . mysqli_connect_error());
}
        $query = "SHOW STATUS LIKE 'ssl_cipher'";
        $result = $mysqli->query($query) or die($mysqli->error.__LINE__);
        if($result->num_rows > 0) {
                while($row = $result->fetch_assoc()) {
                        print_r($row);
                }
        }
        else {
                echo 'NO RESULTS';
        }
        mysqli_close($mysqli);
?>

任何想法都将不胜感激。这真的让我很难受。

看起来是这样的

SSL3\u获取\u服务器\u证书:证书验证失败

我猜你没有正确的CA设置。一些数据库系统(如Amazon Web Services RDS)有自己的CA文件。您正在使用
capath
参数,因此请确保PEM文件位于该路径中。如果是,我接下来要做的就是直接切换到并指定PEM文件

$mysqli->ssl_set(NULL, NULL, '/path/to/ca.pem', NULL, NULL);

这个问题可能是由于PHP5.6中的更改引起的。我猜您正在使用自签名证书?如果DB默认启用对等名称验证,则在PHP中无法禁用此功能。因此,在生成证书时,必须为每个证书使用正确的“通用名称”:

CA:主机名 服务器:FQND,例如hostname.example.com 客户:名字


重要的部分是服务器证书,其中通用名称必须与您连接的主机相同。

谢谢。我确实尝试了ssl_集,因此我直接指定了文件,并且仅使用路径,而不使用整个ssl_集。。。没有骰子。另外,由于PHP应该使用mysql客户端,而且mysql客户端已经过测试,可以正常工作,我不明白为什么PHP突然抱怨CA问题。mysqli客户端不是使用mysql客户端,而是使用其他东西吗?@Tuxie取决于您的配置。一些服务器仍然使用mysql客户端连接到mysql,而另一些服务器使用
mysqlnd
(这是首选)。如果可以的话,去获取并尝试通过这种方式连接到您的服务器(前提是您可以从桌面访问它)。它使用相同的SSL连接选项,并且可能会告诉您是否有其他问题。谢谢您的想法。我想我必须更详细地查看mysqlnd。到目前为止,我认为它会使用mysql客户端,但它可能会做一些完全不同的事情。@Machavity谢谢你的回答。你能为我澄清一下吗?我正试图通过SSL连接到RDS(db用户需要SSL),但我为SSL_set()的第三个参数设置的值似乎并不重要,只要该参数不为NULL。当我打印“SHOW STATUS LIKE'ssl_cipher'”的输出时,我可以看到我确实是通过ssl连接的,不管第三个参数是真路径还是仅仅是“a”。这是预期的吗?由于我对SSL的理解有限,您能给我一个简短的解释吗?谢谢@JackHumphries听起来是一个很好的问题,可以自己发帖。然而,目前也有一个开放的bug,它显然使mysqlnd无法使用SSL和自签名证书:我想我要去AutoSh land了。。。它至少应该起作用。
$mysqli->ssl_set(NULL, NULL, '/path/to/ca.pem', NULL, NULL);