2015-07-11 38 views
2

我试图将PHP mysqli连接设置为两个VPS服务器的MariaDB数据库,并且需要加密通信,因为它在公共网络上。通过SSL的Mysql连接使用PHP mysqli

目前我可以通过命令行mysql客户端正常连接从客户端服务器到数据库服务器,我通过tcpdump检查连接是否加密。但由于某种原因,我无法弄清楚PHP部分。这是相对基本的nginx + php5-fpm + mariadb设置,但mysql正在使用非默认端口。 Debian的杰西,5.6.7的php5,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); 
?> 

主要错误我越来越没有ssl_set:

2015/07/11 15:58:34 [error] 2857#0: *374 FastCGI sent in stderr: "PHP message: PHP Warning: mysqli::real_connect(): SSL operation failed with code 1. OpenSSL Error messages: 
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /srv/www/test.php on line 15 
PHP message: PHP Warning: mysqli::real_connect(): Cannot connect to MySQL by using SSL in /srv/www/test.php on line 15 
PHP message: PHP Warning: mysqli::real_connect(): [2002] (trying to connect via tcp://192.168.130.123:42139) in /srv/www/test.php on line 15 
PHP message: PHP Warning: mysqli::real_connect(): (HY000/2002): in /srv/www/test.php on line 15"..... 

任何想法,将不胜感激。这真的让我失望。

回答

2

可能出现此问题是由于在PHP 5.6中所做的更改。我猜你正在使用自签名证书?如果您的数据库通过DEFAULT启用了peer_name验证,则无法在PHP中禁用此功能。因此,当生成证书时,您必须为每个证书使用正确的“公用名称”:

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

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

+0

正确。然而,目前还有一个开放的bug,这显然使得使用SSL和mysqlnd与自签名证书无法使用SSL:https://bugs.php.net/bug.php?id = 68344 我想我现在要去autossh land。 ..至少应该工作。 – Tuxie

1

看起来这是什么

SSL3_GET_SERVER_CERTIFICATE:证书验证失败

我的猜测是,你没有正确的CA成立做。一些数据库系统(如Amazon Web Services RDS)具有自己的CA文件。您正在使用capath参数,因此请确保PEM文件位于该路径中。如果是这样,接下来的事情我会做的是切换到the third argument of ssl_set并指定PEM文件直接

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

谢谢。我曾尝试过使用ssl_set,以便我直接指定文件,并且仅使用路径而不使用整个ssl_set ...没有骰子。另外因为PHP应该使用mysql客户端,而且mysql客户端已经测试过了,所以我不明白为什么php会突然抱怨CA问题。 mysqli客户端不使用mysql客户端,而是使用其他的东西吗? – Tuxie

+0

@Tuxie取决于你的配置。有些服务器仍然使用mysql-client连接到MySQL,而其他服务器使用mysqlnd(这是首选)。如果可以的话,去[MySQL Workbench](http://dev.mysql.com/downloads/workbench/)并尝试以这种方式连接到你的服务器(假设你可以从你的桌面访问它)。它使用相同的SSL连接选项,并可能告诉你是否有其他错误。 – Machavity

+0

感谢您的想法。我想我将不得不详细检查一下mysqlnd。到目前为止,我认为它会使用mysql客户端,但它可能会做一些完全不同的事情。 – Tuxie